diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+0.16
+----
+
+- Compatibility with mtl-2.3, used with GHC 9.6.
+
 0.15.3
 ------
 
diff --git a/servant-pipes.cabal b/servant-pipes.cabal
--- a/servant-pipes.cabal
+++ b/servant-pipes.cabal
@@ -1,6 +1,6 @@
-cabal-version:       >=1.10
+cabal-version:       2.2
 name:                servant-pipes
-version:             0.15.3
+version:             0.16
 
 synopsis:            Servant Stream support for pipes
 category:            Servant, Web, Pipes
@@ -10,20 +10,20 @@
 
 homepage:            http://docs.servant.dev/
 bug-reports:         http://github.com/haskell-servant/servant/issues
-license:             BSD3
+license:             BSD-3-Clause
 license-file:        LICENSE
 author:              Servant Contributors
 maintainer:          haskell-servant-maintainers@googlegroups.com
 copyright:           2018-2019 Servant Contributors
 build-type:          Simple
-tested-with: GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.2
+tested-with: GHC ==8.6.5 || ==8.8.4 || ==8.10.2
 
 extra-source-files:
   CHANGELOG.md
 
 source-repository head
   type: git
-  location: http://github.com/haskell-servant/servant-pipes.git
+  location: http://github.com/haskell-servant/servant.git
 
 library
   exposed-modules:     Servant.Pipes
@@ -32,9 +32,9 @@
     , bytestring    >=0.10.8.1 && <0.12
     , pipes         >=4.3.9    && <4.4
     , pipes-safe    >=2.3.1    && <2.4
-    , mtl           >=2.2.2    && <2.3
+    , mtl           ^>=2.2.2   || ^>=2.3.1
     , monad-control >=1.0.2.3  && <1.1
-    , servant       >=0.15     && <0.19
+    , servant       >=0.20     && <0.21
   hs-source-dirs:      src
   default-language:    Haskell2010
   ghc-options: -Wall
@@ -50,13 +50,13 @@
     , base-compat
     , bytestring
     , http-media
-    , servant
-    , pipes 
+    , pipes
     , pipes-safe
     , servant-pipes
     , pipes-bytestring  >=2.1.6    && <2.2
-    , servant-server    >=0.15     && <0.19
-    , servant-client    >=0.15     && <0.19
+    , servant           >=0.20     && <0.21
+    , servant-server    >=0.15     && <0.21
+    , servant-client    >=0.15     && <0.21
     , wai               >=3.2.1.2  && <3.3
     , warp              >=3.2.25   && <3.4
     , http-client
diff --git a/src/Servant/Pipes.hs b/src/Servant/Pipes.hs
--- a/src/Servant/Pipes.hs
+++ b/src/Servant/Pipes.hs
@@ -62,14 +62,14 @@
 instance (MonadIO m, a' ~ X, a ~ (), b' ~ (), r ~ ())
     => FromSourceIO b (Proxy a' a b' b m r)
   where
-    fromSourceIO src = M $ liftIO $ S.unSourceT src (return . go) where
+    fromSourceIO src = pure $ M $ liftIO $ S.unSourceT src (return . go) where
         go :: S.StepT IO b -> Proxy X () () b m ()
         go S.Stop        = Pure ()
         go (S.Error err) = M (liftIO (fail err))
         go (S.Skip s)    = go s -- drives
         go (S.Effect ms) = M (liftIO (fmap go ms))
         go (S.Yield x s) = Respond x (const (go s))
-    {-# SPECIALIZE INLINE fromSourceIO :: SourceIO x -> Proxy X () () x IO () #-}
+    {-# SPECIALIZE INLINE fromSourceIO :: SourceIO x -> IO (Proxy X () () x IO ()) #-}
 
 instance MonadIO m => FromSourceIO a (ListT m a) where
-    fromSourceIO = Select . fromSourceIO
+    fromSourceIO src = Select <$> liftIO (fromSourceIO src)
