Index: src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(revision 17446)
+++ src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java	(working copy)
@@ -128,8 +128,8 @@
             if (w1.hasKey(RAILWAY) && w2.hasKey(RAILWAY) && w1.hasTag(RAILWAY, "yard") != w2.hasTag(RAILWAY, "yard")) {
                 return true; // see #20089
             }
-            return (w1.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && w2.hasTag(WATERWAY, "riverbank"))
-                    || (w2.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && w1.hasTag(WATERWAY, "riverbank"));
+            return (w1.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && isRiverArea(w2))
+                    || (w2.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && isRiverArea(w1));
         }
 
         @Override
@@ -314,9 +314,14 @@
     }
 
     static boolean isWaterArea(OsmPrimitive w) {
-        return w.hasTag("natural", "water") || w.hasTag(LANDUSE, "reservoir");
+        return w.hasTag("natural", "water") || w.hasTag("waterway", "riverbank") || w.hasTag(LANDUSE, "reservoir");
     }
 
+    static boolean isRiverArea(OsmPrimitive w) {
+        return w.hasTag("waterway", "riverbank")
+                || (w.hasTag("natural", "water") && w.hasTag("water", "river", "stream", "canal", "drain", "ditch"));
+    }
+
     static boolean isHighway(OsmPrimitive w) {
         return w.hasTagDifferent(HIGHWAY, "rest_area", "services", "bus_stop", "platform");
     }
