Index: data/validator/geometry.mapcss
===================================================================
--- data/validator/geometry.mapcss	(revision 15941)
+++ data/validator/geometry.mapcss	(working copy)
@@ -166,6 +166,12 @@
   throwWarning: tr("Building inside building");
 }
 
+/* Building overlapping building (spatial test) */
+area[building][building!~/no|entrance/][any(tag("layer"),"0") = any(parent_tag("layer"),"0")] ⧉
+area[building][building!~/no|entrance/] {
+  throwWarning: tr("Overlapping buildings");
+}
+
 /* Overlapping areas (spatial test) */
 area[natural =~ /^(water|wetland|coastline)$/], area[landuse=reservoir] {
   set water_area;
@@ -192,7 +198,7 @@
   throwWarning: tr("Overlapping Identical Natural Areas");
 }
 
-area:closed:areaStyle[landuse!=residential][tag("landuse") = parent_tag("landuse")] ⧉ area:closed:areaStyle[landuse][landuse!=residential] {
+area:closed:areaStyle[tag("landuse") = parent_tag("landuse")] ⧉ area:closed:areaStyle[landuse] {
   throwWarning: tr("Overlapping Identical Landuses");
 }
 
Index: src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 15939)
+++ src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(working copy)
@@ -118,9 +118,11 @@
             if (w1.hasKey(HIGHWAY) && w2.hasKey(HIGHWAY) && !Objects.equals(w1.get("level"), w2.get("level"))) {
                 return true;
             }
-            if ((w1.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY) && isResidentialArea(w2))
-             || (w2.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY) && isResidentialArea(w1)))
+            if (isBuilding(w1) && isBuilding(w2))
                 return true;
+            if (((isResidentialArea(w1) || w1.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY)) && isResidentialArea(w2))
+             || ((isResidentialArea(w2) || w2.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY)) && isResidentialArea(w1)))
+                return true;
             if (isSubwayOrTramOrRazed(w2)) {
                 return true;
             }
@@ -141,16 +143,13 @@
 
             if (types[0] == types[1]) {
                 switch (types[0]) {
+                // 610 and 640 where removed for #16707
                 case BARRIER:
                     return new MessageHelper(tr("Crossing barriers"), 603);
-                case BUILDING:
-                    return new MessageHelper(tr("Crossing buildings"), 610);
                 case HIGHWAY:
                     return new MessageHelper(tr("Crossing highways"), 620);
                 case RAILWAY:
                     return new MessageHelper(tr("Crossing railways"), 630);
-                case RESIDENTIAL_AREA:
-                    return new MessageHelper(tr("Crossing residential areas"), 640);
                 case WATERWAY:
                     return new MessageHelper(tr("Crossing waterways"), 650);
                 case WAY:
Index: test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java	(revision 15939)
+++ test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java	(working copy)
@@ -125,7 +125,6 @@
         assertTrue(test.isPrimitiveUsable(newUsableWay("landuse=residential")));
         // createMessage
         testMessage(601, test, "amenity=restaurant", "amenity=restaurant");
-        testMessage(610, test, "building=yes", "building=yes");
         testMessage(611, test, "building=yes", "amenity=restaurant");
         testMessage(612, test, "building=yes", "highway=road");
         testMessage(613, test, "building=yes", "railway=rail");
@@ -138,7 +137,6 @@
         testMessage(630, test, "railway=rail", "railway=rail");
         testMessage(631, test, "railway=rail", "amenity=restaurant");
         testMessage(632, test, "railway=rail", "waterway=river");
-        testMessage(640, test, "landuse=residential", "landuse=residential");
         testMessage(641, test, "landuse=residential", "amenity=restaurant");
         testMessage(650, test, "waterway=river", "waterway=river");
         testMessage(651, test, "waterway=river", "amenity=restaurant");
