diff --git a/goblin/meta.py b/goblin/meta.py
index be20765f80c15f97b3f7f8e6013c6796c6c6325b..0531080ab83252ea002cd21c84fa5703741b2f2d 100644
--- a/goblin/meta.py
+++ b/goblin/meta.py
@@ -24,9 +24,8 @@ class ElementMeta(type):
                 props[k] = v
                 if not isinstance(v, properties.Property):
                     vertex_property = v.__class__
-                    vertex_property.__data_type__ = v.data_type
                     v = properties.VertexPropertyDescriptor(
-                        k, vertex_property, default=v.default)
+                        k, vertex_property, v.data_type, default=v.default)
                 else:
                     v = properties.PropertyDescriptor(
                         k, v.data_type, default=v.default)
diff --git a/goblin/properties.py b/goblin/properties.py
index a35c7e7cab5b0ce42dc92c5c46bc98e58cdd4b99..abbdd626f5acbdfd0084442a859f3c3fe007e094 100644
--- a/goblin/properties.py
+++ b/goblin/properties.py
@@ -31,30 +31,36 @@ class PropertyDescriptor:
             del attr
 
 
-class VertexPropertyDescriptor(PropertyDescriptor):
+class VertexPropertyDescriptor:
     """Descriptor that validates user property input and gets/sets properties
        as instance attributes."""
 
+    def __init__(self, name, vertex_property, data_type, *, default=None):
+        self._name = '_' + name
+        self._vertex_property = vertex_property
+        self._data_type = data_type
+        self._default = default
+
     def __get__(self, obj, objtype):
         if obj is None:
-            return self._data_type
+            return self._vertex_property
         default = self._default
         if default:
-            default = self._data_type(self._default)
+            default = self._data_type.validate(default)
+            default = self._vertex_property(self._default)
         return getattr(obj, self._name, default)
 
     def __set__(self, obj, val):
         if isinstance(val, (list, tuple , set)):
             vertex_property = []
             for v in val:
-                v = self._data_type.__data_type__.validate(v)
+                v = self._data_type.validate(v)
                 vertex_property.append(
-                    self._data_type(self._data_type.__data_type__, value=v))
+                    self._vertex_property(self._data_type, value=v))
 
         else:
-            val = self._data_type.__data_type__.validate(val)
-            vertex_property = self._data_type(
-                self._data_type.__data_type__, value=val)
+            val = self._data_type.validate(val)
+            vertex_property = self._vertex_property(self._data_type, value=val)
         setattr(obj, self._name, vertex_property)
 
 
@@ -74,10 +80,6 @@ class Property(abc.BaseProperty):
     def data_type(self):
         return self._data_type
 
-    @property
-    def vertex_property(self):
-        return self._vertex_property
-
     @property
     def default(self):
         return self._default