diff --git a/nomad/datamodel/data.py b/nomad/datamodel/data.py
index 6fcfd9080d6d3e8a3110a70a450358dc5ff6fc95..f5aa652d28a6078ce830b89358cd6dcbe51054dd 100644
--- a/nomad/datamodel/data.py
+++ b/nomad/datamodel/data.py
@@ -208,7 +208,7 @@ class UserReference(Reference):
         return value.user_id
 
 
-user_reference = UserReference()
+user_reference = UserReference
 
 
 class AuthorReference(Reference):
@@ -233,7 +233,7 @@ class AuthorReference(Reference):
         raise ValueError(f'Cannot serialize {value}.')
 
 
-author_reference = AuthorReference()
+author_reference = AuthorReference
 
 
 class Query(JSON):
diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py
index b659239c55615b1cae221e7b5664d39c8b1210fc..83a20b3094eb49c78e119ab6c9342e7d7c8dd349 100644
--- a/nomad/metainfo/metainfo.py
+++ b/nomad/metainfo/metainfo.py
@@ -474,7 +474,24 @@ class Reference:
 
     @property
     def _proxy_type(self):
-        return self._definition.type if self._definition else SectionReference()
+        return SectionReference() if self._definition is None else self._definition.type
+
+    def _check_shape(self, value):
+        dimension: int = 0
+        target = value
+        while isinstance(target, list):
+            dimension += 1
+            if len(target) == 0:
+                break
+            # assuming consistent data
+            target = target[0]
+
+        if dimension != (
+            0 if self._definition is None else len(self._definition.shape)
+        ):
+            raise ValueError(f'Invalid shape for {value}.')
+
+        return value
 
     def serialize_self(self, section):
         if (context := section.m_root().m_context) is not None:
@@ -540,7 +557,7 @@ class Reference:
 
             return self._normalize_impl(section, _v)
 
-        return _convert(value)
+        return self._check_shape(_convert(value))
 
     def _serialize_impl(self, section, value):
         return _append_id(
diff --git a/tests/metainfo/test_references.py b/tests/metainfo/test_references.py
index d3bb48375742fc9cc0c72f550cbe4949b3d161ff..79e6a6cf34399e10d2cdc87af65cafb3c8b2fdcf 100644
--- a/tests/metainfo/test_references.py
+++ b/tests/metainfo/test_references.py
@@ -426,7 +426,7 @@ def test_user_author(def_type, value, expected_name):
     assert quantity.m_proxy_value == value
     assert (
         quantity.m_proxy_type.target_section_def.name
-        == def_type.target_section_def.name
+        == def_type().target_section_def.name
     )
     assert quantity.m_proxy_section == section
     assert resolved_quantity.name == expected_name
@@ -443,6 +443,6 @@ def test_user_author(def_type, value, expected_name):
     assert deserialized_quantity.m_proxy_value == value
     assert (
         deserialized_quantity.m_proxy_type.target_section_def.name
-        == def_type.target_section_def.name
+        == def_type().target_section_def.name
     )
     assert resolved_deserialized_quantity.name == expected_name