diff --git a/qutil/domains.py b/qutil/domains.py
index b2bff87b76e61c745ca339bcda40ce24a980d011..9b6f2f1fbd4bfc957a6dd1dc33b17a97c4d8a72d 100644
--- a/qutil/domains.py
+++ b/qutil/domains.py
@@ -27,8 +27,11 @@ class Bound(Generic[_RealT]):
     def __set_name__(self, owner, name):
         self._name = f'_{name}'
 
-    def __get__(self, instance, owner) -> _RealT:
-        value = getattr(instance, self._name, set())
+    def __get__(self, instance, owner=None) -> _RealT:
+        if instance is None:
+            return self.default
+
+        value = getattr(instance, self._name, {self.default})
         evaluated = set()
         for item in value:
             if callable(item):
@@ -36,7 +39,7 @@ class Bound(Generic[_RealT]):
             else:
                 evaluated.add(item)
         if self._name.startswith('_lower'):
-            lower = max(evaluated, default=inf)
+            lower = max(evaluated)
             if self.integral:
                 try:
                     return self.cast_lower(lower)
@@ -44,7 +47,7 @@ class Bound(Generic[_RealT]):
                     return lower
             return lower
         if self._name.startswith('_upper'):
-            upper = min(evaluated, default=-inf)
+            upper = min(evaluated)
             if self.integral:
                 try:
                     return self.cast_upper(upper)
@@ -53,7 +56,7 @@ class Bound(Generic[_RealT]):
             return upper
         raise NameError('Bound descriptor instance name should start with lower or upper')
 
-    def __set__(self, instance, value):
+    def __set__(self, instance, value: _BoundT):
         if value is self:
             value = self.default
         if not is_iterable(value):