as though they levitate
That's a good description of the problem. This problem has acquired the name "Peter Panning" amongst people making rendering engines. Because Peter Pan flies. If you'd like, you can find a lot more information about this problem by searching for "Peter Panning shadows".
On the initial file, we see that you have a point light, and you've already enabled contact shadows (which is good.)
The shadows in Eevee can depend on the exact camera position, so I'm going to rotate you camera to face the building and look through it. Let's get an image of our starting point:
Eevee shadows work with a "shadow buffer"-- they do a render from the position of the point light, just rendering the depth. Then when they use the camera, the figure out what the position of a sample would be in that light's depth buffer and see whether it's the frontmost thing. This isn't the exact depth value; instead, a bias to the depth is applied to prevent small errors in precision from creating big, ugly glitches. This is generally an effective way to do things, but it leaves a lot of room for errors.
However, there are quite a few things that we can do to improve that precision. First, we can increase the cube size in render settings. Because the light is a point light, omnidirectional, its shadow buffer is stored as a cube map. If we were using a sun light, its shadow buffer would be a flat image (well, several flat images, it's a "cascade" of flat images), and we'd want to look at the cascade size instead.
Additionally, we should enable "high bit depth" in the shadow settings. If we think about the depth buffer being an image, the cube size refers to its XY, UV resolution, while increasing the bit depth is like rendering to floating point data instead of a 8 bit .png. This will allow the depth buffer to more accurately distinguish between nearby geometry to give more accurate shadows. The more accurate we can make the base shadows, the less we'll have to rely on kludges like contact shadows.
We can see that doing this gives us an immediate improvement to our shadows. However, some problems remain.
The shadow buffer is "biased" in order to prevent problems like shadow acne, where small errors create unpleasant artifacts. However, in our case, that bias is creating its own problems, where the shadows don't come all the way to the wall-- the bias is thicker than the shadowing geometry. So we can adjust our light's bias settings to eye to fix this issue:
I'd encourage you to set the bias to 0.0 and inspect the image, just to see the "shadow acne" artifacts that bias is designed to prevent.
Now, our scene is being shadowed mostly appropriately, but our contact shadows are creating some artifacts. Contact shadows are essentially a hack to make up for some of the problem involved in rasterization lighting. We can eliminate the worst artifacts simply by making the contact shadows smaller, which we'll do by adjusting their thickness:
We just do this to eye, making them as thin as we can make them while preserving the parts where we need those contact shadows to make it all work.
While you could continue to adjust some settings here and there (the light's clip start is set a bit low, which can interfere with precision, the same as setting a camera's near clip too low), you're not going to get a lot better than this. Unfortunately, rasterizer shadows require a lot of hacks to get right. The underlying idea behind shadow buffers is elegant, but the errors in precision from sampling create the need for a lot of different tweaks.