Since 1.14.0 was released, some mob spawns that should be surface spawns are now producing cave mobs instead. Specifically, if the block with sky access is a bottom slab or non-solid block, a mob spawning in the first open space below it should be tagged as a surface mob (i.e. subject to the surface mob density cap), but as of 1.14.0 they are not being tagged and are instead subject to the cave mob density cap.
This issue can cause mob farms to spawn more slowly than they ought to. In fact, a simple mob farm that was built such that it only generated surface monsters would no longer spawn anything.
I have attached a world that demonstrates this problem.
The world has 3 locations you will use: A Spawn Room, a Testing Room, and the Surface. Command blocks are provided to teleport you between these locations.
The world is designed so that only monsters can spawn in it, and only on the spawn floor. (Technically, bats, slimes, and wandering traders can also spawn, but they're immediately killed by repeating command blocks.)
You spawn on the surface in front of a blue square centered in a yellow ring and, farther out, a purple ring. The spawn floor is at Y=68 below the blue square; it is one chunk in size. The purple ring encloses the density cap measurement area for spawns on the spawn floor; it is 9 x 9 chunks in size. The yellow ring encloses the area you need to stay within to prevent mobs from spawning outside the density cap area.
Except for the Spawn Room and the Testing Room, which are mobproofed, the density cap area is entirely filled with stone. This ensures that only monsters can spawn during the test and they can only spawn on the spawn floor. It also ensures that there are no unknown monsters taking up part of the density cap.
The Testing Room is at Y=43, just outside the spawn floor chunk. It's like an AFK room in that when the player is within it, all blocks of the spawn floor are within spawning range The Testing Room also has a lever that controls the "mobspawning" game rule, and a repeating command block that every 10 seconds reports what mobs are present on the spawn floor.
Steps to reproduce:
1. Open the attached world Monster Spawn Lab 2.mcworld.
2. Press the button to teleport to the Spawn Room. Verify that there are no mobs on the spawn floor or in the mob holding pen. If there are, use the Kill Mobs On Spawn Floor button to get rid of them.)
3. Go to the Testing Room and flip the lever to enable mob spawning. A repeating command block will start outputing a list every 10 seconds of any mobs found on the spawn floor or in the holding pen. Wait until 8 mobs are listed; it should take less than 5 minutes. (The density cap for hostile mobs is 8, so no more will spawn if you wait longer.)
4. Disable mob spawning.
5. Go to the Spawn Room. You should see 8 mobs on the spawn floor. Use the button to teleport them to the holding pen. (Note that the pen is outside the spawn floor chunk, but still inside its density cap area.)
6. Go to the surface.
7. Place a bottom slab or any non-solid block in front of the bottommost observer. Command blocks will replicate your block over the entire chunk, so that every block of the spawn floor has your block on the surface above it. This configuration should spawn surface cap monsters.
8. Return to the Testing Room and enable mob spawning again. Wait a few minutes to see if any monsters spawn.
The monsters currently in the holding pen are all cave mobs, but no surface mobs have been spawned so far, so up to 8 new monsters will spawn on the spawn floor.
No more monsters spawn. If at this point you kill the monsters in the holding pen (there's a button for that purpose), the cave density cap will be opened again and up to 8 new monsters will spawn. The fact that they are cave spawns can be verified by checking the Surface property of the entity for each mob.