diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for pinned-warnings
 
+## 0.1.3.0
+* Support GHC 9.12.x
+* Drop support for GHC 9.4
+
 ## 0.1.2.0
 * Support GHC 9.10.x
 * Drop support for GHC 9.2
diff --git a/pinned-warnings.cabal b/pinned-warnings.cabal
--- a/pinned-warnings.cabal
+++ b/pinned-warnings.cabal
@@ -4,7 +4,7 @@
 -- http://haskell.org/cabal/users-guide/
 
 name:                pinned-warnings
-version:             0.1.2.0
+version:             0.1.3.0
 synopsis: Preserve warnings in a GHCi session
 description: Please see the README on GitHub at <https://github.com/aaronallen8455/pinned-warnings#readme>
 homepage:       https://github.com/aaronallen8455/pinned-warnings#readme
@@ -19,7 +19,7 @@
 extra-source-files:
   README.md
   CHANGELOG.md
-tested-with: GHC ==9.4.2 || ==9.6.1 || ==9.8.1 || ==9.10.1
+tested-with: GHC ==9.6.1 || ==9.8.1 || ==9.10.1 || ==9.12.1
 
 library
   exposed-modules:     PinnedWarnings
@@ -28,12 +28,12 @@
                        Internal.GhcFacade
                        Internal.Types
 
-  build-depends:       ghc              >= 9.4 && < 9.11,
+  build-depends:       ghc              >= 9.6 && < 9.13,
                        base             >= 4.16.0 && < 5,
                        bytestring       >= 0.11.3 && < 0.13,
                        containers       >= 0.6.5 && < 0.8,
                        directory        >= 1.3.6 && < 1.4,
-                       time             >= 1.11.1 && < 1.13,
+                       time             >= 1.11.1 && < 2,
                        transformers     >= 0.5.6 && < 0.7
   hs-source-dirs:      src
   default-language:    Haskell2010
diff --git a/src/Internal/GhcFacade.hs b/src/Internal/GhcFacade.hs
--- a/src/Internal/GhcFacade.hs
+++ b/src/Internal/GhcFacade.hs
@@ -2,11 +2,9 @@
 {-# LANGUAGE PatternSynonyms #-}
 module Internal.GhcFacade
   ( module X
-  , TcPluginResult'
   , pattern CDictCan'
   ) where
 
-#if MIN_VERSION_ghc(9,6,0)
 import GHC as X hiding (FunDep)
 import GHC.Core.Class as X
 import GHC.Core.Make as X
@@ -27,36 +25,6 @@
 import GHC.Utils.Logger as X
 import GHC.Utils.Outputable as X
 import GHC.Driver.Config.Diagnostic as X
-
-#elif MIN_VERSION_ghc(9,4,0)
-import GHC as X hiding (FunDep)
-import GHC.Core.Class as X
-import GHC.Core.Make as X
-import GHC.Data.Bag as X
-import GHC.Data.FastString as X
-import GHC.Data.IOEnv as X
-import GHC.Driver.Plugins as X hiding (TcPlugin)
-import GHC.Driver.Env.Types as X
-import GHC.Tc.Errors.Types as X
-import GHC.Tc.Plugin as X
-import GHC.Tc.Types as X hiding (DefaultingPlugin)
-import GHC.Tc.Types.Constraint as X
-import GHC.Tc.Types.Evidence as X
-import GHC.Types.Error as X
-import GHC.Types.Name.Occurrence as X
-import GHC.Types.SrcLoc as X
-import GHC.Utils.Error as X
-import GHC.Utils.Logger as X
-import GHC.Utils.Outputable as X
-import GHC.Driver.Config.Diagnostic as X
-
-#endif
-
-#if MIN_VERSION_ghc(9,4,0)
-type TcPluginResult' = X.TcPluginSolveResult
-#else
-type TcPluginResult' = X.TcPluginResult
-#endif
 
 pattern CDictCan'
   :: CtEvidence
diff --git a/src/PinnedWarnings.hs b/src/PinnedWarnings.hs
--- a/src/PinnedWarnings.hs
+++ b/src/PinnedWarnings.hs
@@ -50,9 +50,7 @@
     { Ghc.tcPluginInit  = initTcPlugin
     , Ghc.tcPluginSolve = \pluginState _ _ -> checkWanteds pluginState
     , Ghc.tcPluginStop  = const $ pure ()
-#if MIN_VERSION_ghc(9,4,0)
     , Ghc.tcPluginRewrite = mempty
-#endif
     }
 
 data PluginState =
@@ -76,11 +74,7 @@
 lookupClass className = do
   result <- Ghc.findImportedModule
               (Ghc.mkModuleName "ShowWarnings")
-#if MIN_VERSION_ghc(9,4,0)
               Ghc.NoPkgQual
-#else
-              (Just "pinned-warnings")
-#endif
 
   case result of
     Ghc.Found _ mod' -> do
@@ -93,7 +87,7 @@
 -- warnings into GHC.
 checkWanteds :: PluginState
              -> [Ghc.Ct]
-             -> Ghc.TcPluginM Ghc.TcPluginResult'
+             -> Ghc.TcPluginM Ghc.TcPluginSolveResult
 checkWanteds pluginState
     = fmap (flip Ghc.TcPluginOk [] . catMaybes)
     . traverse go
@@ -141,15 +135,9 @@
              <$> Ghc.tcPluginIO (readMVar globalState)
 
   Ghc.tcPluginIO . atomicModifyIORef' errsRef
-#if MIN_VERSION_ghc(9,6,0)
     $ \messages ->
         (Ghc.mkMessages ((fmap . fmap) Ghc.mkTcRnUnknownMessage pinnedWarns)
           `Ghc.unionMessages` messages, ())
-#elif MIN_VERSION_ghc(9,4,0)
-    $ \messages ->
-        (Ghc.mkMessages ((fmap . fmap) Ghc.TcRnUnknownMessage pinnedWarns)
-          `Ghc.unionMessages` messages, ())
-#endif
 
 -- | Remove warnings for modules that no longer exist
 pruneDeleted :: IO ()
@@ -168,13 +156,8 @@
 -- This occurs before any new warnings are captured for the module.
 resetPinnedWarnsForMod
   :: Ghc.ModSummary
-#if MIN_VERSION_ghc(9,4,0)
   -> Ghc.ParsedResult
   -> Ghc.Hsc Ghc.ParsedResult
-#else
-  -> Ghc.HsParsedModule
-  -> Ghc.Hsc Ghc.HsParsedModule
-#endif
 resetPinnedWarnsForMod modSummary parsedModule = do
   let modFile = fromString $ Ghc.ms_hspp_file modSummary
 
@@ -193,11 +176,7 @@
     warningsHook :: Ghc.LogAction -> Ghc.LogAction
     warningsHook logAction dynFlags messageClass srcSpan sdoc = do
       case messageClass of
-#if MIN_VERSION_ghc(9,6,0)
         Ghc.MCDiagnostic Ghc.SevWarning _ _
-#else
-        Ghc.MCDiagnostic Ghc.SevWarning _
-#endif
           | Ghc.RealSrcLoc start _ <- Ghc.srcSpanStart srcSpan
           , Ghc.RealSrcLoc end _ <- Ghc.srcSpanEnd srcSpan
           , Just modFile <- Ghc.srcSpanFileName_maybe srcSpan
