Index: src/org/openstreetmap/josm/data/osm/PrimitiveId.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/org/openstreetmap/josm/data/osm/PrimitiveId.java b/src/org/openstreetmap/josm/data/osm/PrimitiveId.java
--- a/src/org/openstreetmap/josm/data/osm/PrimitiveId.java	(revision 18564)
+++ b/src/org/openstreetmap/josm/data/osm/PrimitiveId.java	(date 1664460025261)
@@ -16,7 +16,9 @@
     long getUniqueId();
 
     /**
-     * Gets the type of object represented by this object.
+     * Gets the type of object represented by this object. Note that this should
+     * return the base primitive type ({@link OsmPrimitiveType#NODE},
+     * {@link OsmPrimitiveType#WAY}, and {@link OsmPrimitiveType#RELATION}).
      *
      * @return the object type
      * @see Node
Index: src/org/openstreetmap/josm/data/vector/VectorDataStore.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/org/openstreetmap/josm/data/vector/VectorDataStore.java b/src/org/openstreetmap/josm/data/vector/VectorDataStore.java
--- a/src/org/openstreetmap/josm/data/vector/VectorDataStore.java	(revision 18564)
+++ b/src/org/openstreetmap/josm/data/vector/VectorDataStore.java	(date 1664394788727)
@@ -267,9 +267,18 @@
     private <T extends Tile & VectorTile> VectorRelation areaToRelation(T tile, Layer layer,
       Collection<VectorPrimitive> featureObjects, Area area) {
         VectorRelation vectorRelation = new VectorRelation(layer.getName());
-        for (VectorPrimitive member : pathIteratorToObjects(tile, layer, featureObjects, area.getPathIterator(null))) {
+        PathIterator pathIterator = area.getPathIterator(null);
+        int windingRule = pathIterator.getWindingRule();
+        for (VectorPrimitive member : pathIteratorToObjects(tile, layer, featureObjects, pathIterator)) {
             final String role;
             if (member instanceof VectorWay && ((VectorWay) member).isClosed()) {
+                // Area messes up the winding. See #22404.
+                if (windingRule == PathIterator.WIND_NON_ZERO) {
+                    VectorWay vectorWay = (VectorWay) member;
+                    List<VectorNode> nodes = new ArrayList<>(vectorWay.getNodes());
+                    Collections.reverse(nodes);
+                    vectorWay.setNodes(nodes);
+                }
                 role = Geometry.isClockwise(((VectorWay) member).getNodes()) ? "outer" : "inner";
             } else {
                 role = "";
@@ -374,8 +383,13 @@
         } else if (shape instanceof Path2D) {
             primitive = pathToWay(tile, layer, featureObjects, (Path2D) shape).stream().findFirst().orElse(null);
         } else if (shape instanceof Area) {
-            primitive = areaToRelation(tile, layer, featureObjects, (Area) shape);
-            primitive.put(RELATION_TYPE, MULTIPOLYGON_TYPE);
+            VectorRelation vectorRelation = areaToRelation(tile, layer, featureObjects, (Area) shape);
+            if (vectorRelation.getMembersCount() != 1) {
+                primitive = vectorRelation;
+                primitive.put(RELATION_TYPE, MULTIPOLYGON_TYPE);
+            } else {
+                primitive = vectorRelation.getMember(0).getMember();
+            }
         } else {
             // We shouldn't hit this, but just in case
             throw new UnsupportedOperationException(Objects.toString(shape));
Index: src/org/openstreetmap/josm/data/vector/VectorWay.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/org/openstreetmap/josm/data/vector/VectorWay.java b/src/org/openstreetmap/josm/data/vector/VectorWay.java
--- a/src/org/openstreetmap/josm/data/vector/VectorWay.java	(revision 18564)
+++ b/src/org/openstreetmap/josm/data/vector/VectorWay.java	(date 1664459858805)
@@ -130,6 +130,11 @@
 
     @Override
     public OsmPrimitiveType getType() {
+        return OsmPrimitiveType.WAY;
+    }
+
+    @Override
+    public OsmPrimitiveType getDisplayType() {
         return this.isClosed() ? OsmPrimitiveType.CLOSEDWAY : OsmPrimitiveType.WAY;
     }
 }
