diff --git a/src/Network/Wai/Trans.hs b/src/Network/Wai/Trans.hs
--- a/src/Network/Wai/Trans.hs
+++ b/src/Network/Wai/Trans.hs
@@ -21,9 +21,8 @@
 
 import Network.Wai (Application, Middleware, Request, Response, ResponseReceived)
 
-import Data.Singleton.Class (Extractable (runSingleton))
 import Control.Monad.Catch (Exception, MonadCatch (catch))
-import Control.Monad.Trans.Control.Aligned (MonadBaseControl (liftBaseWith))
+import Control.Monad.IO.Unlift (MonadUnliftIO (withRunInIO), askRunInIO, liftIO)
 
 
 -- | Isomorphic to @Kleisli (ContT ResponseReceived m) Request Response@
@@ -32,34 +31,32 @@
 
 -- * Lift and Run
 
-liftApplication :: MonadBaseControl IO m stM
-                => Extractable stM
+liftApplication :: MonadUnliftIO m
                 => Application -- ^ To lift
                 -> ApplicationT m
-liftApplication app req resp = liftBaseWith (\runInBase -> app req (\r -> runSingleton <$> runInBase (resp r)))
+liftApplication app req respond = withRunInIO (\toIO -> app req (toIO . respond))
 
-liftMiddleware :: MonadBaseControl IO m stM
-               => Extractable stM
+liftMiddleware :: MonadUnliftIO m
                => Middleware -- ^ To lift
                -> MiddlewareT m
 liftMiddleware mid app req respond = do
   app' <- runApplicationT app
-  liftBaseWith (\runInBase -> mid app' req (fmap runSingleton . runInBase . respond))
+  withRunInIO (\toIO -> mid app' req (toIO . respond))
 
-runApplicationT :: MonadBaseControl IO m stM
-                => Extractable stM
+runApplicationT :: MonadUnliftIO m
                 => ApplicationT m -- ^ To run
                 -> m Application
-runApplicationT app = liftBaseWith $ \runInBase ->
-  pure $ \req respond -> fmap runSingleton $ runInBase $ app req (\x -> liftBaseWith (\_ -> respond x))
+runApplicationT app = do 
+  toIO <- askRunInIO
+  pure $ \req respond -> toIO . app req $ liftIO . respond
 
-runMiddlewareT :: MonadBaseControl IO m stM
-               => Extractable stM
+runMiddlewareT :: MonadUnliftIO m
                => MiddlewareT m -- ^ To run
                -> m Middleware
-runMiddlewareT mid = liftBaseWith $ \runInBase ->
+runMiddlewareT mid = do
+  toIO <- askRunInIO
   pure $ \app req respond -> do
-    app' <- fmap runSingleton $ runInBase $ runApplicationT (mid (liftApplication app))
+    app' <- toIO $ runApplicationT (mid (liftApplication app))
     app' req respond
 
 -- * Monad Morphisms
diff --git a/src/Network/WebSockets/Trans.hs b/src/Network/WebSockets/Trans.hs
--- a/src/Network/WebSockets/Trans.hs
+++ b/src/Network/WebSockets/Trans.hs
@@ -18,9 +18,7 @@
 import Network.WebSockets (ConnectionOptions, ClientApp, ServerApp, Connection, PendingConnection)
 import Network.Wai.Handler.WebSockets (websocketsOr)
 import Network.Wai.Trans (MiddlewareT, runApplicationT, liftApplication)
-import Data.Singleton.Class (Extractable (runSingleton))
-import Control.Monad.IO.Class (MonadIO (liftIO))
-import Control.Monad.Trans.Control.Aligned (MonadBaseControl (liftBaseWith))
+import Control.Monad.IO.Unlift (MonadUnliftIO (withRunInIO), askRunInIO, MonadIO (liftIO))
 
 
 -- * Websockets
@@ -32,12 +30,12 @@
               -> ServerAppT m
 liftServerApp s = liftIO . s
 
-runServerAppT :: MonadBaseControl IO m stM
-              => Extractable stM
+runServerAppT :: MonadUnliftIO m
               => ServerAppT m -- ^ To run
               -> m ServerApp
-runServerAppT s = liftBaseWith $ \runInBase ->
-  pure $ \pending -> runSingleton <$> runInBase (s pending)
+runServerAppT s = do
+  toIO <- askRunInIO
+  pure $ \pending -> toIO $ s pending
 
 type ClientAppT m a = Connection -> m a
 
@@ -46,19 +44,17 @@
               -> ClientAppT m a
 liftClientApp c = liftIO . c
 
-runClientAppT :: MonadBaseControl IO m stM
-              => Extractable stM
+runClientAppT :: MonadUnliftIO m
               => ClientAppT m a -- ^ To run
               -> m (ClientApp a)
-runClientAppT c = liftBaseWith $ \runInBase ->
-  pure $ \conn -> runSingleton <$> runInBase (c conn)
-
+runClientAppT c = do
+  toIO <- askRunInIO
+  pure $ \conn -> toIO $ c conn
 
 -- * WAI Compatability
 
 -- | Respond with the WebSocket server when applicable, as a middleware
-websocketsOrT :: MonadBaseControl IO m stM
-              => Extractable stM
+websocketsOrT :: MonadUnliftIO m
               => ConnectionOptions
               -> ServerAppT m -- ^ Server
               -> MiddlewareT m
diff --git a/wai-transformers.cabal b/wai-transformers.cabal
--- a/wai-transformers.cabal
+++ b/wai-transformers.cabal
@@ -1,22 +1,24 @@
--- This file has been generated from package.yaml by hpack version 0.21.2.
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.37.0.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 8e306e52f1f366b2119966770b3cebf95cf4d551b833e42765a246aa7acf78df
+-- hash: d039f3b98166ce2d066c5df7b9e98c4ce21bacd0e31f6671ed97eaae6940f76a
 
 name:           wai-transformers
-version:        0.1.0
-description:    Please see the README on Github at <https://git.localcooking.com/tooling/wai-transformers#readme>
+version:        0.2.0
+synopsis:       Monad transformers for WAI and WebSockets
+description:    Please see the README on Github at <https://github.com/athanclark/wai-transformers#readme>
+category:       Web
 homepage:       https://github.com/athanclark/wai-transformers#readme
 bug-reports:    https://github.com/athanclark/wai-transformers/issues
 author:         Athan Clark
-maintainer:     athan.clark@localcooking.com
-copyright:      2018 Athan Clark
+maintainer:     aclark@araliasoftware.com
+copyright:      2025 Athan Clark
 license:        BSD3
 license-file:   LICENSE
 build-type:     Simple
-cabal-version:  >= 1.10
-
 extra-source-files:
     README.md
 
@@ -36,9 +38,8 @@
   build-depends:
       base >=4.8 && <5
     , exceptions
-    , extractable-singleton >=0.0.1
-    , monad-control-aligned >=0.0.1
     , transformers
+    , unliftio-core
     , wai >=3.2.1
     , wai-websockets
     , websockets >=0.12.4
