diff --git a/src/lib/Qd/Observable.hs b/src/lib/Qd/Observable.hs
index 2063bed4b1032e6016e8ee0e2797ed3d52e0f541..c784cecc79bab973e567636afacda4b89e3feaf7 100644
--- a/src/lib/Qd/Observable.hs
+++ b/src/lib/Qd/Observable.hs
@@ -6,6 +6,7 @@ module Qd.Observable (
   subscribe',
   SubscriptionHandle(..),
   RegistrationHandle(..),
+  Disposable(..),
   ObservableCallback,
   ObservableState,
   ObservableMessage,
@@ -38,6 +39,13 @@ mapObservableMessage f (r, s) = (r, ) <$> f s
 newtype SubscriptionHandle = SubscriptionHandle { unsubscribe :: IO () }
 newtype RegistrationHandle = RegistrationHandle { deregister :: IO () }
 
+class Disposable a where
+  dispose :: a -> IO ()
+instance Disposable SubscriptionHandle where
+  dispose = unsubscribe
+instance Disposable RegistrationHandle where
+  dispose = deregister
+
 class Observable v o | o -> v where
   getValue :: o -> IO (ObservableState v)
   subscribe :: o -> (ObservableMessage v -> IO ()) -> IO SubscriptionHandle