diff --git a/src/Quasar/Observable.hs b/src/Quasar/Observable.hs
index 97670e04e18f513c1b920c3051d7aec7945c889f..0faa1663de8e4914b36534de97be55dc98849f48 100644
--- a/src/Quasar/Observable.hs
+++ b/src/Quasar/Observable.hs
@@ -44,8 +44,6 @@ import Control.Monad.Trans.Maybe
 import Data.HashMap.Strict qualified as HM
 import Data.IORef
 import Data.Unique
-import Quasar.Async
-import Quasar.Future
 import Quasar.Prelude
 import Quasar.MonadQuasar
 import Quasar.MonadQuasar.Misc
@@ -79,7 +77,7 @@ instance Monad ObservableState where
 class IsRetrievable r a | a -> r where
   retrieve :: (MonadQuasar m, MonadIO m) => a -> m r
 
-class IsRetrievable r a => IsObservable r a | a -> r where
+class IsObservable r a | a -> r where
   -- | Register a callback to observe changes. The callback is called when the value changes, but depending on the
   -- delivery method (e.g. network) intermediate values may be skipped.
   --
@@ -132,8 +130,6 @@ type ObservableCallback a = ObservableState a -> QuasarSTM ()
 
 -- | Existential quantification wrapper for the IsObservable type class.
 data Observable r = forall a. IsObservable r a => Observable a
-instance IsRetrievable r (Observable r) where
-  retrieve (Observable o) = retrieve o
 instance IsObservable r (Observable r) where
   observe (Observable o) = observe o
   toObservable = id
@@ -256,8 +252,6 @@ instance IsObservable a (ThrowObservable a) where
 
 
 data MappedObservable a = forall b. MappedObservable (b -> a) (Observable b)
-instance IsRetrievable a (MappedObservable a) where
-  retrieve (MappedObservable f observable) = f <$> retrieve observable
 instance IsObservable a (MappedObservable a) where
   observe (MappedObservable fn observable) callback = observe observable (callback . fmap fn)
   mapObservable f1 (MappedObservable f2 upstream) = toObservable $ MappedObservable (f1 . f2) upstream
@@ -269,12 +263,6 @@ instance IsObservable a (MappedObservable a) where
 -- There is no caching involed, every subscriber effectively subscribes to both input observables.
 data LiftA2Observable r = forall a b. LiftA2Observable (a -> b -> r) (Observable a) (Observable b)
 
-instance IsRetrievable a (LiftA2Observable a) where
-  retrieve (LiftA2Observable fn fx fy) = liftQuasarIO do
-    -- TODO LATER: keep backpressure for parallel network requests
-    future <- async $ retrieve fy
-    liftA2 fn (retrieve fx) (await future)
-
 instance IsObservable a (LiftA2Observable a) where
   observe (LiftA2Observable fn fx fy) callback = liftQuasarSTM do
     var0 <- newTVar Nothing
@@ -292,11 +280,6 @@ instance IsObservable a (LiftA2Observable a) where
 
 data BindObservable a = forall b. BindObservable (Observable b) (b -> Observable a)
 
-instance IsRetrievable a (BindObservable a) where
-  retrieve (BindObservable fx fn) = do
-    x <- retrieve fx
-    retrieve $ fn x
-
 instance IsObservable a (BindObservable a) where
   observe (BindObservable fx fn) callback = liftQuasarSTM do
     -- TODO Dispose in STM to remove potential extraneous (/invalid?) updates while disposing
@@ -331,9 +314,6 @@ instance IsObservable a (BindObservable a) where
 
 data CatchObservable e a = Exception e => CatchObservable (Observable a) (e -> Observable a)
 
-instance IsRetrievable a (CatchObservable e a) where
-  retrieve (CatchObservable fx fn) = retrieve fx `catch` \ex -> retrieve (fn ex)
-
 instance IsObservable a (CatchObservable e a) where
   observe (CatchObservable fx fn) callback = liftQuasarSTM do
     callback ObservableLoading