Seeing objects fall into another even with collisions on, always makes one word pop up in my mind, Normals.
They are the problem here and at the same time the solution.
The object below the cloth object is acting like it's a box, nicely taking the cloth object fall inside it. If you go in the "Viewport Overlays" and activate the "Face Orientation" checkbox, you'll see that the lower objects normals are showing red, which indicates that they are facing inside.
This is essentially making the supposed to be mattress a box, as the collision with the top will be ignored since there is no collision with the backside of the topside, but once the cloth object is inside the mattress, it's captured.
- Select the mattress object and go in "Edit Mode" with Tab
- Select all vertices with A
- Open the "Normals menu" with Alt+N in the Viewport, and click on "Flip" (in this case all normals are facing the wrong way, so this is easy, other times you may need to use "Recalculate Outside").
- You can deactivate the show "Face Orientation" again.
Here a little visual aid/explanatory video:
[Regarding the issue with the size of your objects before]
You mentioned the size of the objects, while it usually is not as much of a problem, there are cases when the size of the object is too small and results in the simulation failing. That is because the simulation is based on steps, where each step there is a check on collision, which then leads to a more complex resolving of the situation. That said, too small objects can be stepped over, as in one step the collision would not yet happen, and the next step the simulation is already past the object, thus resulting in no collision at all.
For completeness sake i mention rigid bodies here too, since both have their settings at different places.
The rigid body related "Steps Per Second" value can be found here:
The cloth related "Quality Steps" value and "Quality" related to collisions can be found here: