diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 See also http://pvp.haskell.org/faq
 
+0.6.2.3
+-------
+
+* Bump base for GHC 9.4 comp
+* Fix code to *really* support mtl-2.3
+
 0.6.2.2
 -------
 
diff --git a/hackage-security.cabal b/hackage-security.cabal
--- a/hackage-security.cabal
+++ b/hackage-security.cabal
@@ -1,6 +1,6 @@
 cabal-version:       1.12
 name:                hackage-security
-version:             0.6.2.2
+version:             0.6.2.3
 
 synopsis:            Hackage security library
 description:         The hackage security library provides both server and
@@ -31,7 +31,7 @@
 build-type:          Simple
 
 tested-with:
-  GHC==9.2.1, GHC==9.0.2,
+  GHC==9.4.1, GHC==9.2.4, GHC==9.0.2,
   GHC==8.10.7, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2,
   GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
 
@@ -117,7 +117,7 @@
                        Hackage.Security.Util.TypedEmbedded
                        MyPrelude
   -- We support ghc 7.4 (bundled with Cabal 1.14) and up
-  build-depends:       base              >= 4.5     && < 4.17,
+  build-depends:       base              >= 4.5     && < 4.18,
                        base16-bytestring >= 0.1.1   && < 1.1,
                        base64-bytestring >= 1.0     && < 1.3,
                        bytestring        >= 0.9     && < 0.12,
@@ -130,7 +130,7 @@
                        -- 0.4.2 introduces TarIndex, 0.4.4 introduces more
                        -- functionality, 0.5.0 changes type of serialise
                        tar               >= 0.5     && < 0.6,
-                       template-haskell  >= 2.7     && < 2.19,
+                       template-haskell  >= 2.7     && < 2.20,
                        time              >= 1.2     && < 1.13,
                        transformers      >= 0.3     && < 0.7,
                        zlib              >= 0.5     && < 0.7,
@@ -284,8 +284,8 @@
                        tasty-hunit      == 0.10.*,
                        tasty-quickcheck == 0.10.*,
                        QuickCheck       >= 2.11 && <2.15,
-                       aeson            == 1.4.* || == 1.5.* || == 2.0.*,
-                       vector           == 0.12.*,
+                       aeson            == 1.4.* || == 1.5.* || == 2.0.* || == 2.1.*,
+                       vector           >= 0.12 && <0.14,
                        unordered-containers >=0.2.8.0 && <0.3,
                        temporary        >= 1.2 && < 1.4
 
diff --git a/src/Hackage/Security/Client/Repository/Remote.hs b/src/Hackage/Security/Client/Repository/Remote.hs
--- a/src/Hackage/Security/Client/Repository/Remote.hs
+++ b/src/Hackage/Security/Client/Repository/Remote.hs
@@ -30,7 +30,8 @@
 import MyPrelude
 import Control.Concurrent
 import Control.Exception
-import Control.Monad.Cont
+import Control.Monad (when, unless)
+import Control.Monad.IO.Class (MonadIO)
 import Data.List (nub, intercalate)
 import Data.Typeable
 import Network.URI hiding (uriPath, path)
@@ -337,7 +338,7 @@
         unless rangeSupport $ exit $ CannotUpdate hasGz UpdateImpossibleUnsupported
 
         -- We must already have a local file to be updated
-        mCachedIndex <- lift $ Cache.getCachedIndex cfgCache (hasFormatGet hasGz)
+        mCachedIndex <- liftIO $ Cache.getCachedIndex cfgCache (hasFormatGet hasGz)
         cachedIndex  <- case mCachedIndex of
           Nothing -> exit $ CannotUpdate hasGz UpdateImpossibleNoLocalCopy
           Just fp -> return fp
diff --git a/src/Hackage/Security/Client/Verify.hs b/src/Hackage/Security/Client/Verify.hs
--- a/src/Hackage/Security/Client/Verify.hs
+++ b/src/Hackage/Security/Client/Verify.hs
@@ -12,7 +12,9 @@
 
 import MyPrelude
 import Control.Exception
-import Control.Monad.Reader
+import Control.Monad (join, void)
+import Control.Monad.IO.Class (MonadIO, liftIO)
+import Control.Monad.Reader (ReaderT, runReaderT, ask)
 import Data.IORef
 
 import Hackage.Security.Util.IO
diff --git a/src/Hackage/Security/JSON.hs b/src/Hackage/Security/JSON.hs
--- a/src/Hackage/Security/JSON.hs
+++ b/src/Hackage/Security/JSON.hs
@@ -41,8 +41,9 @@
 import MyPrelude
 import Control.Arrow (first, second)
 import Control.Exception
-import Control.Monad.Except
-import Control.Monad.Reader
+import Control.Monad (unless, liftM)
+import Control.Monad.Except (MonadError, Except, ExceptT, runExcept, runExceptT, throwError)
+import Control.Monad.Reader (MonadReader, Reader, runReader, local, ask)
 import Data.Functor.Identity
 import Data.Typeable (Typeable)
 import qualified Data.ByteString.Lazy as BS.L
diff --git a/src/Hackage/Security/TUF/Patterns.hs b/src/Hackage/Security/TUF/Patterns.hs
--- a/src/Hackage/Security/TUF/Patterns.hs
+++ b/src/Hackage/Security/TUF/Patterns.hs
@@ -27,7 +27,7 @@
   ) where
 
 import MyPrelude
-import Control.Monad.Except
+import Control.Monad (guard)
 import Language.Haskell.TH (Q, Exp)
 import System.FilePath.Posix
 import qualified Language.Haskell.TH.Syntax as TH
diff --git a/src/Hackage/Security/Trusted/TCB.hs b/src/Hackage/Security/Trusted/TCB.hs
--- a/src/Hackage/Security/Trusted/TCB.hs
+++ b/src/Hackage/Security/Trusted/TCB.hs
@@ -28,7 +28,8 @@
 
 import MyPrelude
 import Control.Exception
-import Control.Monad.Except
+import Control.Monad (when, unless)
+import Control.Monad.Except (Except, runExcept, throwError)
 import Data.Typeable
 import Data.Time
 import Hackage.Security.TUF
diff --git a/src/Hackage/Security/Util/Exit.hs b/src/Hackage/Security/Util/Exit.hs
--- a/src/Hackage/Security/Util/Exit.hs
+++ b/src/Hackage/Security/Util/Exit.hs
@@ -1,7 +1,8 @@
 module Hackage.Security.Util.Exit where
 
 import MyPrelude
-import Control.Monad.Except
+import Control.Monad (liftM)
+import Control.Monad.Except (ExceptT, runExceptT, throwError)
 
 {-------------------------------------------------------------------------------
   Auxiliary: multiple exit points
