diff --git a/PKG-INFO b/PKG-INFO
index c27c44f2a7804cc3922dfd614a561d9d92595adf..28f60989f166171176b3099affeb56523631efda 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: swh.model
-Version: 6.4.0
+Version: 6.4.1
 Summary: Software Heritage data model
 Home-page: https://forge.softwareheritage.org/diffusion/DMOD/
 Author: Software Heritage developers
diff --git a/swh.model.egg-info/PKG-INFO b/swh.model.egg-info/PKG-INFO
index c27c44f2a7804cc3922dfd614a561d9d92595adf..28f60989f166171176b3099affeb56523631efda 100644
--- a/swh.model.egg-info/PKG-INFO
+++ b/swh.model.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: swh.model
-Version: 6.4.0
+Version: 6.4.1
 Summary: Software Heritage data model
 Home-page: https://forge.softwareheritage.org/diffusion/DMOD/
 Author: Software Heritage developers
diff --git a/swh/model/model.py b/swh/model/model.py
index 8910db8cf98e0b6738e8f7c1f40326f676094583..b77bfa6a5c5031ea31273b789c24cbf57809e0a7 100644
--- a/swh/model/model.py
+++ b/swh/model/model.py
@@ -1564,6 +1564,12 @@ class RawExtrinsicMetadata(HashableObject, BaseModel):
 
     @classmethod
     def from_dict(cls, d):
+        if "type" in d:
+            # Convert from old schema
+            type_ = d.pop("type")
+            if type_ == "origin":
+                d["target"] = str(Origin(d["target"]).swhid())
+
         d = {
             **d,
             "target": ExtendedSWHID.from_string(d["target"]),
diff --git a/swh/model/tests/test_model.py b/swh/model/tests/test_model.py
index 4540c433db2b00630a8a0366e440a5892c74600d..1fd832a22311ae3e79dcf9335eb62a68bc264c78 100644
--- a/swh/model/tests/test_model.py
+++ b/swh/model/tests/test_model.py
@@ -1401,7 +1401,7 @@ _content_swhid = ExtendedSWHID.from_string(
 )
 _origin_url = "https://forge.softwareheritage.org/source/swh-model.git"
 _origin_swhid = ExtendedSWHID.from_string(
-    "swh:1:ori:94a9ed024d3859793618152ea559a168bbcbb5e2"
+    "swh:1:ori:433b4f5612f0720ed51fa7aeaf43a3625870057b"
 )
 _dummy_qualifiers = {"origin": "https://example.com", "lines": "42"}
 _common_metadata_fields = dict(
@@ -1428,6 +1428,41 @@ def test_metadata_valid():
     )
 
 
+def test_metadata_from_old_dict():
+    common_fields = {
+        "authority": {"type": "forge", "url": "https://forge.softwareheritage.org"},
+        "fetcher": {
+            "name": "test-fetcher",
+            "version": "0.0.1",
+        },
+        "discovery_date": _common_metadata_fields["discovery_date"],
+        "format": "json",
+        "metadata": b'{"origin": "https://example.com", "lines": "42"}',
+    }
+
+    m = RawExtrinsicMetadata(
+        target=_origin_swhid,
+        **_common_metadata_fields,
+    )
+    assert (
+        RawExtrinsicMetadata.from_dict(
+            {"id": m.id, "target": _origin_url, "type": "origin", **common_fields}
+        )
+        == m
+    )
+
+    m = RawExtrinsicMetadata(
+        target=_content_swhid,
+        **_common_metadata_fields,
+    )
+    assert (
+        RawExtrinsicMetadata.from_dict(
+            {"target": str(_content_swhid), "type": "content", **common_fields}
+        )
+        == m
+    )
+
+
 def test_metadata_to_dict():
     """Checks valid RawExtrinsicMetadata objects don't raise an error."""
 
@@ -1448,7 +1483,7 @@ def test_metadata_to_dict():
     )
     assert m.to_dict() == {
         "target": str(_origin_swhid),
-        "id": b"@j\xc9\x01\xbc\x1e#p*\xf3q9\xa7u\x97\x00\x14\x02xa",
+        "id": b"\xa3)q\x0f\xf7p\xc7\xb0\\O\xe8\x84\x83Z\xb0]\x81\xe9\x95\x13",
         **common_fields,
     }
     assert RawExtrinsicMetadata.from_dict(m.to_dict()) == m