diff --git a/swh/model/identifiers.py b/swh/model/identifiers.py
index e4598eb3efde98f835c6672c564de70f76994a53..44daee52915162b633962335652caf79d803182f 100644
--- a/swh/model/identifiers.py
+++ b/swh/model/identifiers.py
@@ -857,6 +857,17 @@ class CoreSWHID(_BaseSWHID[ObjectType]):
     )
     """the type of object the identifier points to"""
 
+    def to_extended(self) -> ExtendedSWHID:
+        """Converts this CoreSWHID into an ExtendedSWHID.
+
+        As ExtendedSWHID is a superset of CoreSWHID, this is lossless."""
+        return ExtendedSWHID(
+            namespace=self.namespace,
+            scheme_version=self.scheme_version,
+            object_type=ExtendedObjectType(self.object_type.value),
+            object_id=self.object_id,
+        )
+
 
 def _parse_core_swhid(swhid: Union[str, CoreSWHID, None]) -> Optional[CoreSWHID]:
     if swhid is None or isinstance(swhid, CoreSWHID):
diff --git a/swh/model/tests/test_identifiers.py b/swh/model/tests/test_identifiers.py
index 5fad92ba121c1f52ce6ee54212f02dc77d55f450..a3a5295f5bca6bdd6c70675cb9b9add40f542ea3 100644
--- a/swh/model/tests/test_identifiers.py
+++ b/swh/model/tests/test_identifiers.py
@@ -1368,6 +1368,18 @@ def test_parse_unparse_swhids(string, core, qualified, extended):
             assert string == str(parsed_swhid)
 
 
+@pytest.mark.parametrize(
+    "core,extended",
+    [
+        pytest.param(core, extended, id=string)
+        for (string, core, qualified, extended) in VALID_SWHIDS
+        if core is not None
+    ],
+)
+def test_core_to_extended(core, extended):
+    assert core.to_extended() == extended
+
+
 @pytest.mark.parametrize(
     "ns,version,type,id,qualifiers",
     [