diff --git a/ghcide.cabal b/ghcide.cabal
--- a/ghcide.cabal
+++ b/ghcide.cabal
@@ -2,7 +2,7 @@
 build-type:         Simple
 category:           Development
 name:               ghcide
-version:            2.2.0.0
+version:            2.3.0.0
 license:            Apache-2.0
 license-file:       LICENSE
 author:             Digital Asset and Ghcide contributors
@@ -13,7 +13,7 @@
     A library for building Haskell IDE's on top of the GHC API.
 homepage:           https://github.com/haskell/haskell-language-server/tree/master/ghcide#readme
 bug-reports:        https://github.com/haskell/haskell-language-server/issues
-tested-with:        GHC == 8.10.7 || == 9.0.2 || == 9.2.5
+tested-with:        GHC == 9.0.2 || == 9.2.5
 extra-source-files: README.md CHANGELOG.md
                     test/data/**/*.project
                     test/data/**/*.cabal
@@ -44,7 +44,6 @@
     default-language:   Haskell2010
     build-depends:
         aeson,
-        aeson-pretty,
         array,
         async,
         base == 4.*,
@@ -70,7 +69,7 @@
         haddock-library >= 1.8 && < 1.12,
         hashable,
         hie-compat ^>= 0.3.0.0,
-        hls-plugin-api == 2.2.0.0,
+        hls-plugin-api == 2.3.0.0,
         lens,
         list-t,
         hiedb == 0.4.3.*,
@@ -86,7 +85,7 @@
         row-types,
         text-rope,
         safe-exceptions,
-        hls-graph == 2.2.0.0,
+        hls-graph == 2.3.0.0,
         sorted-list,
         sqlite-simple,
         stm,
@@ -104,7 +103,7 @@
         unliftio-core,
         ghc-boot-th,
         ghc-boot,
-        ghc >= 8.10,
+        ghc >= 9.0,
         ghc-check >=0.5.0.8,
         ghc-paths,
         cryptohash-sha1 >=0.11.100 && <0.12,
@@ -193,6 +192,7 @@
         Development.IDE.LSP.Outline
         Development.IDE.LSP.Server
         Development.IDE.Session
+        Development.IDE.Session.Diagnostics
         Development.IDE.Spans.Common
         Development.IDE.Spans.Documentation
         Development.IDE.Spans.AtPoint
@@ -228,6 +228,7 @@
                 -Wall
                 -Wincomplete-uni-patterns
                 -Wno-unticked-promoted-constructors
+                -Wunused-packages
                 -fno-ignore-asserts
 
     if flag(ghc-patched-unboxed-bytecode)
@@ -254,9 +255,6 @@
     if impl(ghc >= 9.2) && flag(pedantic)
         ghc-options: -Wwarn=ambiguous-fields
 
-    if impl(ghc >= 9)
-        ghc-options: -Wunused-packages
-
     if flag(ekg)
         build-depends:
             ekg-wai,
@@ -397,10 +395,8 @@
           record-hasfield
     if impl(ghc < 9.3)
        build-depends:  ghc-typelits-knownnat
-    if impl(ghc >= 9)
-        ghc-options: -Wunused-packages
     hs-source-dirs: test/cabal test/exe test/src
-    ghc-options: -threaded -Wall -Wno-name-shadowing -O0 -Wno-unticked-promoted-constructors
+    ghc-options: -threaded -Wall -Wno-name-shadowing -O0 -Wno-unticked-promoted-constructors -Wunused-packages
     main-is: Main.hs
     other-modules:
         Development.IDE.Test.Runfiles
diff --git a/session-loader/Development/IDE/Session.hs b/session-loader/Development/IDE/Session.hs
--- a/session-loader/Development/IDE/Session.hs
+++ b/session-loader/Development/IDE/Session.hs
@@ -34,14 +34,12 @@
 import           Data.Bifunctor
 import qualified Data.ByteString.Base16               as B16
 import qualified Data.ByteString.Char8                as B
-import           Data.Char                            (isLower)
 import           Data.Default
 import           Data.Either.Extra
 import           Data.Function
 import           Data.Hashable                        hiding (hash)
 import qualified Data.HashMap.Strict                  as HM
 import           Data.List
-import           Data.List.Extra                      (dropPrefix, split)
 import qualified Data.Map.Strict                      as Map
 import           Data.Maybe
 import           Data.Proxy
@@ -69,7 +67,6 @@
 import           Development.IDE.Types.Options
 import           GHC.Check
 import qualified HIE.Bios                             as HieBios
-import qualified HIE.Bios.Cradle                      as HieBios
 import           HIE.Bios.Environment                 hiding (getCacheDir)
 import           HIE.Bios.Types                       hiding (Log)
 import qualified HIE.Bios.Types                       as HieBios
@@ -103,6 +100,7 @@
 import qualified Data.HashSet                         as Set
 import           Database.SQLite.Simple
 import           Development.IDE.Core.Tracing         (withTrace)
+import           Development.IDE.Session.Diagnostics  (renderCradleError)
 import           Development.IDE.Types.Shake          (WithHieDb)
 import           HieDb.Create
 import           HieDb.Types
@@ -685,7 +683,7 @@
              Left err -> do
                dep_info <- getDependencyInfo (maybeToList hieYaml)
                let ncfp = toNormalizedFilePath' cfp
-               let res = (map (renderCradleError cradle ncfp) err, Nothing)
+               let res = (map (\err' -> renderCradleError err' cradle ncfp) err, Nothing)
                void $ modifyVar' fileToFlags $
                     Map.insertWith HM.union hieYaml (HM.singleton ncfp (res, dep_info))
                void $ modifyVar' filesMap $ HM.insert ncfp hieYaml
@@ -768,7 +766,6 @@
 #endif
 emptyHscEnv nc libDir = do
     env <- runGhc (Just libDir) getSession
-    initDynLinker env
     pure $ setNameCache nc (hscSetFlags ((hsc_dflags env){useUnicode = True }) env)
 
 data TargetDetails = TargetDetails
@@ -924,72 +921,6 @@
           & maybe id setHiDir hiCacheDir
           & maybe id setHieDir hieCacheDir
           & maybe id setODir oCacheDir
-
-
-renderCradleError :: Cradle a -> NormalizedFilePath -> CradleError -> FileDiagnostic
-renderCradleError cradle nfp (CradleError _ _ec ms) =
-  ideErrorWithSource (Just "cradle") (Just DiagnosticSeverity_Error) nfp $ T.unlines $ map T.pack userFriendlyMessage
-  where
-
-    userFriendlyMessage :: [String]
-    userFriendlyMessage
-      | HieBios.isCabalCradle cradle = fromMaybe ms fileMissingMessage
-      | otherwise = ms
-
-    fileMissingMessage :: Maybe [String]
-    fileMissingMessage =
-      multiCradleErrMessage <$> parseMultiCradleErr ms
-
--- | Information included in Multi Cradle error messages
-data MultiCradleErr = MultiCradleErr
-  { mcPwd      :: FilePath
-  , mcFilePath :: FilePath
-  , mcPrefixes :: [(FilePath, String)]
-  } deriving (Show)
-
--- | Attempt to parse a multi-cradle message
-parseMultiCradleErr :: [String] -> Maybe MultiCradleErr
-parseMultiCradleErr ms = do
-  _  <- lineAfter "Multi Cradle: "
-  wd <- lineAfter "pwd: "
-  fp <- lineAfter "filepath: "
-  ps <- prefixes
-  pure $ MultiCradleErr wd fp ps
-
-  where
-    lineAfter :: String -> Maybe String
-    lineAfter pre = listToMaybe $ mapMaybe (stripPrefix pre) ms
-
-    prefixes :: Maybe [(FilePath, String)]
-    prefixes = do
-      pure $ mapMaybe tuple ms
-
-    tuple :: String -> Maybe (String, String)
-    tuple line = do
-      line' <- surround '(' line ')'
-      [f, s] <- pure $ split (==',') line'
-      pure (f, s)
-
-    -- extracts the string surrounded by required characters
-    surround :: Char -> String -> Char -> Maybe String
-    surround start s end = do
-      guard (listToMaybe s == Just start)
-      guard (listToMaybe (reverse s) == Just end)
-      pure $ drop 1 $ take (length s - 1) s
-
-multiCradleErrMessage :: MultiCradleErr -> [String]
-multiCradleErrMessage e =
-    [ "Loading the module '" <> moduleFileName <> "' failed. It may not be listed in your .cabal file!"
-    , "Perhaps you need to add `"<> moduleName <> "` to other-modules or exposed-modules."
-    , "For more information, visit: https://cabal.readthedocs.io/en/3.4/developing-packages.html#modules-included-in-the-package"
-    , ""
-    ] <> map prefix (mcPrefixes e)
-  where
-    localFilePath f = dropWhile (==pathSeparator) $ dropPrefix (mcPwd e) f
-    moduleFileName = localFilePath $ mcFilePath e
-    moduleName = intercalate "." $ map dropExtension $ dropWhile isSourceFolder $ splitDirectories moduleFileName
-    isSourceFolder p = all isLower $ take 1 p
-    prefix (f, r) = f <> " - " <> r
 
 -- See Note [Multi Cradle Dependency Info]
 type DependencyInfo = Map.Map FilePath (Maybe UTCTime)
diff --git a/session-loader/Development/IDE/Session/Diagnostics.hs b/session-loader/Development/IDE/Session/Diagnostics.hs
new file mode 100644
--- /dev/null
+++ b/session-loader/Development/IDE/Session/Diagnostics.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric  #-}
+
+module Development.IDE.Session.Diagnostics where
+import           Control.Applicative
+import           Control.Monad
+import qualified Data.Aeson                        as Aeson
+import           Data.List
+import           Data.List.Extra                   (split)
+import           Data.Maybe
+import qualified Data.Text                         as T
+import           Development.IDE.Types.Diagnostics
+import           Development.IDE.Types.Location
+import           GHC.Generics
+import qualified HIE.Bios.Cradle                   as HieBios
+import           HIE.Bios.Types                    hiding (Log)
+import           System.FilePath
+
+data CradleErrorDetails =
+  CradleErrorDetails
+    { cabalProjectFiles :: [FilePath]
+    -- ^ files related to the cradle error
+    -- i.e. .cabal, cabal.project, etc.
+    } deriving (Show, Eq, Ord, Read, Generic, Aeson.ToJSON, Aeson.FromJSON)
+
+{- | Takes a cradle error, the corresponding cradle and the file path where
+  the cradle error occurred (of the file we attempted to load).
+  Depicts the cradle error in a user-friendly way.
+-}
+renderCradleError :: CradleError -> Cradle a -> NormalizedFilePath -> FileDiagnostic
+renderCradleError (CradleError deps _ec ms) cradle nfp
+  | HieBios.isCabalCradle cradle =
+      let (fp, showDiag, diag) = ideErrorWithSource (Just "cradle") (Just DiagnosticSeverity_Error) nfp $ T.unlines $ map T.pack userFriendlyMessage in
+        (fp, showDiag, diag{_data_ = Just $ Aeson.toJSON CradleErrorDetails{cabalProjectFiles=absDeps}})
+  | otherwise = ideErrorWithSource (Just "cradle") (Just DiagnosticSeverity_Error) nfp $ T.unlines $ map T.pack userFriendlyMessage
+  where
+    absDeps = fmap (cradleRootDir cradle </>) deps
+    userFriendlyMessage :: [String]
+    userFriendlyMessage
+      | HieBios.isCabalCradle cradle = fromMaybe ms $ fileMissingMessage <|> mkUnknownModuleMessage
+      | otherwise = ms
+
+    mkUnknownModuleMessage :: Maybe [String]
+    mkUnknownModuleMessage
+      | any (isInfixOf "Failed extracting script block:") ms =
+          Just $ unknownModuleMessage (fromNormalizedFilePath nfp)
+      | otherwise = Nothing
+
+    fileMissingMessage :: Maybe [String]
+    fileMissingMessage =
+      multiCradleErrMessage <$> parseMultiCradleErr ms
+
+-- | Information included in Multi Cradle error messages
+data MultiCradleErr = MultiCradleErr
+  { mcPwd      :: FilePath
+  , mcFilePath :: FilePath
+  , mcPrefixes :: [(FilePath, String)]
+  } deriving (Show)
+
+-- | Attempt to parse a multi-cradle message
+parseMultiCradleErr :: [String] -> Maybe MultiCradleErr
+parseMultiCradleErr ms = do
+  _  <- lineAfter "Multi Cradle: "
+  wd <- lineAfter "pwd: "
+  fp <- lineAfter "filepath: "
+  ps <- prefixes
+  pure $ MultiCradleErr wd fp ps
+
+  where
+    lineAfter :: String -> Maybe String
+    lineAfter pre = listToMaybe $ mapMaybe (stripPrefix pre) ms
+
+    prefixes :: Maybe [(FilePath, String)]
+    prefixes = do
+      pure $ mapMaybe tuple ms
+
+    tuple :: String -> Maybe (String, String)
+    tuple line = do
+      line' <- surround '(' line ')'
+      [f, s] <- pure $ split (==',') line'
+      pure (f, s)
+
+    -- extracts the string surrounded by required characters
+    surround :: Char -> String -> Char -> Maybe String
+    surround start s end = do
+      guard (listToMaybe s == Just start)
+      guard (listToMaybe (reverse s) == Just end)
+      pure $ drop 1 $ take (length s - 1) s
+
+multiCradleErrMessage :: MultiCradleErr -> [String]
+multiCradleErrMessage e =
+    unknownModuleMessage (mcFilePath e)
+    <> [""]
+    <> map prefix (mcPrefixes e)
+  where
+    prefix (f, r) = f <> " - " <> r
+
+unknownModuleMessage :: String -> [String]
+unknownModuleMessage moduleFileName =
+  [ "Loading the module '" <> moduleFileName <> "' failed."
+  , ""
+  , "It may not be listed in your .cabal file!"
+  , "Perhaps you need to add `"<> dropExtension (takeFileName moduleFileName) <> "` to other-modules or exposed-modules."
+  , ""
+  , "For more information, visit: https://cabal.readthedocs.io/en/3.4/developing-packages.html#modules-included-in-the-package"
+  ]
diff --git a/src/Development/IDE/Core/Compile.hs b/src/Development/IDE/Core/Compile.hs
--- a/src/Development/IDE/Core/Compile.hs
+++ b/src/Development/IDE/Core/Compile.hs
@@ -108,16 +108,9 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,1)
-import           HscTypes
-import           TcSplice
-#endif
-
-#if MIN_VERSION_ghc(9,0,1)
 import           GHC.Tc.Gen.Splice
-#endif
 
-#if MIN_VERSION_ghc(9,0,1) && !MIN_VERSION_ghc(9,2,1)
+#if !MIN_VERSION_ghc(9,2,1)
 import           GHC.Driver.Types
 #endif
 
@@ -525,7 +518,6 @@
         (guts, details) <- tidyProgram tidy_opts simplified_guts
         pure (details, guts)
 
-#if MIN_VERSION_ghc(9,0,1)
   let !partial_iface = force $ mkPartialIface session
 #if MIN_VERSION_ghc(9,5,0)
                                               (cg_binds guts)
@@ -540,11 +532,6 @@
 #if MIN_VERSION_ghc(9,4,2)
                     Nothing
 #endif
-
-#else
-  let !partial_iface = force (mkPartialIface session details simplified_guts)
-  final_iface' <- mkFullIface session partial_iface
-#endif
   let final_iface = final_iface' {mi_globals = Nothing, mi_usages = filterUsages (mi_usages final_iface')} -- See Note [Clearing mi_globals after generating an iface]
 
   -- Write the core file now
@@ -693,10 +680,8 @@
                           session' = hscSetFlags newFlags session
 #if MIN_VERSION_ghc(9,4,2)
                       (outputFilename, _mStub, _foreign_files, _cinfos, _stgcinfos) <- hscGenHardCode session' guts
-#elif MIN_VERSION_ghc(9,0,1)
-                      (outputFilename, _mStub, _foreign_files, _cinfos) <- hscGenHardCode session' guts
 #else
-                      (outputFilename, _mStub, _foreign_files) <- hscGenHardCode session' guts
+                      (outputFilename, _mStub, _foreign_files, _cinfos) <- hscGenHardCode session' guts
 #endif
                                 (ms_location summary)
                                 fp
@@ -839,7 +824,6 @@
     -- don't export an interface which allows for additional information to be added to hie files.
     let fake_splice_binds = Util.listToBag (map (mkVarBind unitDataConId) (spliceExpressions $ tmrTopLevelSplices tcm))
         real_binds = tcg_binds $ tmrTypechecked tcm
-#if MIN_VERSION_ghc(9,0,1)
         ts = tmrTypechecked tcm :: TcGblEnv
         top_ev_binds = tcg_ev_binds ts :: Util.Bag EvBind
         insts = tcg_insts ts :: [ClsInst]
@@ -851,19 +835,14 @@
       Just <$>
 #endif
           GHC.enrichHie (fake_splice_binds `Util.unionBags` real_binds) (tmrRenamed tcm) top_ev_binds insts tcs
-#else
-    Just <$> GHC.enrichHie (fake_splice_binds `Util.unionBags` real_binds) (tmrRenamed tcm)
-#endif
   where
     dflags = hsc_dflags hscEnv
-#if MIN_VERSION_ghc(9,0,0)
     run _ts = -- ts is only used in GHC 9.2
 #if MIN_VERSION_ghc(9,2,0) && !MIN_VERSION_ghc(9,3,0)
         fmap (join . snd) . liftIO . initDs hscEnv _ts
 #else
         id
 #endif
-#endif
 
 spliceExpressions :: Splices -> [LHsExpr GhcTc]
 spliceExpressions Splices{..} =
@@ -1258,10 +1237,8 @@
        -> Util.StringBuffer -- ^ Haskell module source text (full Unicode is supported)
 #if MIN_VERSION_ghc(9,5,0)
        -> ExceptT [FileDiagnostic] m ([FileDiagnostic], Located(HsModule GhcPs))
-#elif MIN_VERSION_ghc(9,0,1)
-       -> ExceptT [FileDiagnostic] m ([FileDiagnostic], Located(HsModule))
 #else
-       -> ExceptT [FileDiagnostic] m ([FileDiagnostic], Located(HsModule GhcPs))
+       -> ExceptT [FileDiagnostic] m ([FileDiagnostic], Located(HsModule))
 #endif
 parseHeader dflags filename contents = do
    let loc  = mkRealSrcLoc (Util.mkFastString filename) 1 1
diff --git a/src/Development/IDE/GHC/CPP.hs b/src/Development/IDE/GHC/CPP.hs
--- a/src/Development/IDE/GHC/CPP.hs
+++ b/src/Development/IDE/GHC/CPP.hs
@@ -21,16 +21,9 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if MIN_VERSION_ghc (8,10,0) && !MIN_VERSION_ghc(9,0,0)
-import qualified DriverPipeline                  as Pipeline
-import           ToolSettings
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import           GHC.Settings
-#endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,3,0)
+#if !MIN_VERSION_ghc(9,3,0)
 import qualified GHC.Driver.Pipeline             as Pipeline
 #endif
 
diff --git a/src/Development/IDE/GHC/Compat.hs b/src/Development/IDE/GHC/Compat.hs
--- a/src/Development/IDE/GHC/Compat.hs
+++ b/src/Development/IDE/GHC/Compat.hs
@@ -31,10 +31,6 @@
     pattern PFailedWithErrorMessages,
     isObjectLinkable,
 
-#if !MIN_VERSION_ghc(9,0,1)
-    RefMap,
-#endif
-
 #if MIN_VERSION_ghc(9,2,0)
 #if !MIN_VERSION_ghc(9,3,0)
     extendModSummaryNoDeps,
@@ -72,7 +68,6 @@
     enrichHie,
     writeHieFile,
     readHieFile,
-    supportsHieFiles,
     setHieDir,
     dontWriteHieFiles,
     module Compat.HieTypes,
@@ -170,39 +165,6 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import           Annotations                           (AnnTarget (ModuleTarget),
-                                                        Annotation (..),
-                                                        extendAnnEnvList)
-import           ByteCodeAsm                           (bcoFreeNames)
-import           ByteCodeGen                           (coreExprToBCOs)
-import           CoreLint                              (lintInteractiveExpr)
-import           CorePrep                              (corePrepExpr,
-                                                        corePrepPgm)
-import           CoreSyn                               (CoreExpr,
-                                                        Unfolding (..),
-                                                        flattenBinds,
-                                                        noUnfolding)
-import           CoreTidy                              (tidyExpr)
-import           Hooks                                 (hscCompileCoreExprHook)
-import           Linker                                (linkExpr)
-import qualified SimplCore                             as GHC
-import           UniqDFM
-import           UniqDSet
-import           UniqSet
-import           VarEnv                                (emptyInScopeSet,
-                                                        emptyTidyEnv, mkRnEnv2)
-import           FastString
-import qualified Avail
-import           DynFlags                              hiding (ExposePackage)
-import           HscTypes
-import           MkIface                               hiding (writeIfaceFile)
-
-import           StringBuffer                          (hPutStringBuffer)
-import qualified SysTools
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import qualified GHC.Core.Opt.Pipeline                 as GHC
 import           GHC.Core.Tidy                         (tidyExpr)
 import           GHC.CoreToStg.Prep                    (corePrepPgm)
@@ -224,16 +186,15 @@
 import           GHC.Iface.Make                        (mkIfaceExports)
 import qualified GHC.SysTools.Tasks                    as SysTools
 import qualified GHC.Types.Avail                       as Avail
-#endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 import           GHC.Utils.Error
 import           GHC.CoreToByteCode                    (coreExprToBCOs)
 import           GHC.Runtime.Linker                    (linkExpr)
 import           GHC.Driver.Types
 #endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,5,0)
+#if !MIN_VERSION_ghc(9,5,0)
 import           GHC.Core.Lint                         (lintInteractiveExpr)
 #endif
 
@@ -400,14 +361,11 @@
 getDependentMods :: ModIface -> [ModuleName]
 #if MIN_VERSION_ghc(9,3,0)
 getDependentMods = map (gwib_mod . snd) . S.toList . dep_direct_mods . mi_deps
-#elif MIN_VERSION_ghc(9,0,0)
-getDependentMods = map gwib_mod . dep_mods . mi_deps
 #else
-getDependentMods = map fst . dep_mods . mi_deps
+getDependentMods = map gwib_mod . dep_mods . mi_deps
 #endif
 
 simplifyExpr :: DynFlags -> HscEnv -> CoreExpr -> IO CoreExpr
-#if MIN_VERSION_ghc(9,0,0)
 #if MIN_VERSION_ghc(9,5,0)
 simplifyExpr _ env = GHC.simplifyExpr (Development.IDE.GHC.Compat.Env.hsc_logger env) (ue_eps (Development.IDE.GHC.Compat.Env.hsc_unit_env env)) (initSimplifyExprOpts (hsc_dflags env) (hsc_IC env))
 #else
@@ -423,10 +381,6 @@
 corePrepExpr _ = GHC.corePrepExpr
 #endif
 
-#else
-simplifyExpr df _ = GHC.simplifyExpr df
-#endif
-
 renderMessages :: PsMessages -> (Bag WarnMsg, Bag ErrMsg)
 renderMessages msgs =
 #if MIN_VERSION_ghc(9,3,0)
@@ -451,9 +405,6 @@
 #endif
 {-# COMPLETE POk, PFailedWithErrorMessages #-}
 
-supportsHieFiles :: Bool
-supportsHieFiles = True
-
 hieExportNames :: HieFile -> [(SrcSpan, Name)]
 hieExportNames = nameListFromAvails . hie_exports
 
@@ -483,10 +434,6 @@
 upNameCache = updNameCache
 #endif
 
-#if !MIN_VERSION_ghc(9,0,1)
-type RefMap a = Map.Map Identifier [(Span, IdentifierDetails a)]
-#endif
-
 mkHieFile' :: ModSummary
            -> [Avail.AvailInfo]
            -> HieASTs Type
@@ -554,7 +501,6 @@
 
 
 
-#if MIN_VERSION_ghc(9,0,0)
 getNodeIds :: HieAST a -> Map.Map Identifier (IdentifierDetails a)
 getNodeIds = Map.foldl' combineNodeIds Map.empty . getSourcedNodeInfo . sourcedNodeInfo
 
@@ -579,35 +525,11 @@
     mergeSorted axs [] = axs
     mergeSorted [] bxs = bxs
 
-#else
-
-getNodeIds :: HieAST a -> NodeIdentifiers a
-getNodeIds = nodeIdentifiers . nodeInfo
--- import qualified FastString as FS
-
--- nodeInfo' :: HieAST TypeIndex -> NodeInfo TypeIndex
-nodeInfo' :: Ord a => HieAST a -> NodeInfo a
-nodeInfo' = nodeInfo
--- type Unit = UnitId
--- moduleUnit :: Module -> Unit
--- moduleUnit = moduleUnitId
--- unhelpfulSpanFS :: FS.FastString -> FS.FastString
--- unhelpfulSpanFS = id
-#endif
-
 sourceNodeInfo :: HieAST a -> Maybe (NodeInfo a)
-#if MIN_VERSION_ghc(9,0,0)
 sourceNodeInfo = Map.lookup SourceInfo . getSourcedNodeInfo . sourcedNodeInfo
-#else
-sourceNodeInfo = Just . nodeInfo
-#endif
 
 generatedNodeInfo :: HieAST a -> Maybe (NodeInfo a)
-#if MIN_VERSION_ghc(9,0,0)
 generatedNodeInfo = Map.lookup GeneratedInfo . getSourcedNodeInfo . sourcedNodeInfo
-#else
-generatedNodeInfo = sourceNodeInfo -- before ghc 9.0, we don't distinguish the source
-#endif
 
 data GhcVersion
   = GHC810
@@ -677,11 +599,7 @@
 #endif
 
 mkAstNode :: NodeInfo a -> Span -> [HieAST a] -> HieAST a
-#if MIN_VERSION_ghc(9,0,0)
 mkAstNode n = Node (SourcedNodeInfo $ Map.singleton GeneratedInfo n)
-#else
-mkAstNode = Node
-#endif
 
 combineRealSrcSpans :: RealSrcSpan -> RealSrcSpan -> RealSrcSpan
 #if MIN_VERSION_ghc(9,2,0)
diff --git a/src/Development/IDE/GHC/Compat/Core.hs b/src/Development/IDE/GHC/Compat/Core.hs
--- a/src/Development/IDE/GHC/Compat/Core.hs
+++ b/src/Development/IDE/GHC/Compat/Core.hs
@@ -40,9 +40,7 @@
     readIface,
     loadSysInterface,
     importDecl,
-#if MIN_VERSION_ghc(8,8,0)
     CommandLineOption,
-#endif
 #if !MIN_VERSION_ghc(9,2,0)
     staticPlugins,
 #endif
@@ -74,10 +72,6 @@
     -- slightly unsafe
     setUnsafeGlobalDynFlags,
     -- * Linear Haskell
-#if !MIN_VERSION_ghc(9,0,0)
-    Scaled,
-    unrestricted,
-#endif
     scaledThing,
     -- * Interface Files
     IfaceExport,
@@ -95,12 +89,7 @@
     mkPartialIface,
     mkFullIface,
     checkOldIface,
-#if MIN_VERSION_ghc(9,0,0)
     IsBootInterface(..),
-#else
-    pattern IsBoot,
-    pattern NotBoot,
-#endif
     -- * Fixity
     LexicalFixity(..),
     Fixity (..),
@@ -142,7 +131,6 @@
     Development.IDE.GHC.Compat.Core.splitForAllTyCoVars,
 #endif
     mkVisFunTys,
-    Development.IDE.GHC.Compat.Core.mkInfForAllTys,
     -- * Specs
     ImpDeclSpec(..),
     ImportSpec(..),
@@ -276,7 +264,6 @@
     Unlinked(..),
     Linkable(..),
     unload,
-    initDynLinker,
     -- * Hooks
     Hooks,
     runMetaHook,
@@ -329,7 +316,6 @@
     collectHsBindsBinders,
 #endif
     -- * Util Module re-exports
-#if MIN_VERSION_ghc(9,0,0)
     module GHC.Builtin.Names,
     module GHC.Builtin.Types,
     module GHC.Builtin.Types.Prim,
@@ -399,63 +385,12 @@
     module GHC.Types.Unique.Supply,
     module GHC.Types.Var,
     module GHC.Unit.Module,
-#else
-    module BasicTypes,
-    module Class,
-    module Coercion,
-    module Predicate,
-    module ConLike,
-    module CoreUtils,
-    module DataCon,
-    module DsExpr,
-    module DsMonad,
-    module ErrUtils,
-    module FamInst,
-    module FamInstEnv,
-    module HeaderInfo,
-    module Id,
-    module InstEnv,
-    module IfaceSyn,
-    module Module,
-    module Name,
-    module NameCache,
-    module NameEnv,
-    module NameSet,
-    module PatSyn,
-    module PprTyThing,
-    module PrelInfo,
-    module PrelNames,
-    module RdrName,
-    module RnSplice,
-    module RnNames,
-    module TcEnv,
-    module TcEvidence,
-    module TcType,
-    module TcRnTypes,
-    module TcRnDriver,
-    module TcRnMonad,
-    module TyCon,
-    module TysPrim,
-    module TysWiredIn,
-    module Type,
-    module Unify,
-    module UniqFM,
-    module UniqSupply,
-    module Var,
-#endif
     -- * Syntax re-exports
-#if MIN_VERSION_ghc(9,0,0)
     module GHC.Hs,
     module GHC.Hs.Binds,
     module GHC.Parser,
     module GHC.Parser.Header,
     module GHC.Parser.Lexer,
-#else
-    module GHC.Hs,
-    module ExtractDocs,
-    module Parser,
-    module Lexer,
-#endif
 #if MIN_VERSION_ghc(9,3,0)
     CompileReason(..),
     hsc_type_env_vars,
@@ -509,94 +444,6 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import qualified Avail
-import           BasicTypes                   hiding (Version)
-import           Class
-import           CmdLineParser                (Warn (..))
-import           ConLike
-import           CoreUtils
-import           DataCon                      hiding (dataConExTyCoVars)
-import qualified DataCon
-import           DriverPhases
-import           DriverPipeline
-import           DsExpr
-import           DsMonad                      hiding (foldrM)
-import           DynFlags                     hiding (ExposePackage)
-import qualified DynFlags
-import           ErrUtils                     hiding (logInfo, mkWarnMsg)
-import           ExtractDocs
-import           FamInst
-import           FamInstEnv
-import           Finder                       hiding (mkHomeModLocation)
-import           GHC.Hs                       hiding (HsLet, LetStmt)
-import qualified GHCi
-import           GhcMonad
-import           HeaderInfo                   hiding (getImports)
-import           Hooks
-import           HscMain                      as GHC
-import           HscTypes
-import           Id
-import           IfaceSyn
-import           InstEnv
-import           Lexer                        
-import qualified Linker
-import           LoadIface
-import           MkIface                      as GHC
-import           Module                       hiding (ModLocation (..), UnitId,
-                                               addBootSuffixLocnOut,
-                                               moduleUnitId)
-import qualified Module
-import           Name                         hiding (varName)
-import           NameCache
-import           NameEnv
-import           NameSet
-import           Packages
-import           Panic                        hiding (try)
-import qualified PlainPanic                   as Plain
-import           Parser
-import           PatSyn
-import           RnFixity
-import           Plugins
-import           PprTyThing                   hiding (pprFamInst)
-import           PrelInfo
-import           PrelNames                    hiding (Unique, printName)
-import           RdrName                      hiding (GRE, gre_name, gre_imp, gre_lcl, gre_par)
-import qualified RdrName
-import           RnNames
-import           RnSplice
-import qualified SrcLoc
-import           TcEnv
-import           TcEvidence                   hiding ((<.>))
-import           TcIface
-import           TcRnDriver
-import           TcRnMonad                    hiding (Applicative (..), IORef,
-                                               MonadFix (..), MonadIO (..),
-                                               allM, anyM, concatMapM, foldrM,
-                                               mapMaybeM, (<$>))
-import           TcRnTypes
-import           TcType
-import           TidyPgm                     as GHC
-import qualified TyCoRep
-import           TyCon
-import           Type
-import           TysPrim
-import           TysWiredIn
-import           Unify
-import           UniqFM hiding (UniqFM)
-import qualified UniqFM
-import           UniqSupply
-import           Var                          (Var (varName), setTyVarUnique,
-                                               setVarUnique, varType)
-
-import           Coercion                     (coercionKind)
-import           Predicate
-import           SrcLoc                       (Located, SrcLoc (UnhelpfulLoc),
-                                               SrcSpan (UnhelpfulSpan))
-import qualified Finder as GHC
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import           GHC.Builtin.Names            hiding (Unique, printName)
 import           GHC.Builtin.Types
 import           GHC.Builtin.Types.Prim
@@ -608,14 +455,13 @@
 import qualified GHC.Core.DataCon             as DataCon
 import           GHC.Core.FamInstEnv          hiding (pprFamInst)
 import           GHC.Core.InstEnv
-import           GHC.Types.Unique.FM hiding (UniqFM)
-import qualified GHC.Types.Unique.FM          as UniqFM
+import           GHC.Types.Unique.FM 
 import           GHC.Core.PatSyn
 import           GHC.Core.Predicate
 import           GHC.Core.TyCo.Ppr
 import qualified GHC.Core.TyCo.Rep            as TyCoRep
 import           GHC.Core.TyCon
-import           GHC.Core.Type                hiding (mkInfForAllTys)
+import           GHC.Core.Type                
 import           GHC.Core.Unify
 import           GHC.Core.Utils
 import           GHC.Driver.CmdLine           (Warn (..))
@@ -676,9 +522,8 @@
 import           GHC.Utils.Error              (Severity (..), emptyMessages)
 import           GHC.Utils.Panic              hiding (try)
 import qualified GHC.Utils.Panic.Plain        as Plain
-#endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 import           GHC.Core.Ppr.TyThing         hiding (pprFamInst)
 import           GHC.Core.TyCo.Rep            (scaledThing)
 import           GHC.Driver.Finder hiding     (mkHomeModLocation)
@@ -761,12 +606,6 @@
 mkHomeModLocation = GHC.mkHomeModLocation
 #endif
 
-
-#if !MIN_VERSION_ghc(9,0,0)
-type BufSpan = ()
-type BufPos = ()
-#endif
-
 #if MIN_VERSION_ghc(9,3,0)
 pattern RealSrcSpan :: SrcLoc.RealSrcSpan -> Maybe BufSpan -> SrcLoc.SrcSpan
 #else
@@ -777,11 +616,8 @@
 pattern RealSrcSpan x y <- SrcLoc.RealSrcSpan x ((\case Strict.Nothing -> Nothing; Strict.Just a -> Just a) -> y) where
   RealSrcSpan x y = SrcLoc.RealSrcSpan x (case y of Nothing -> Strict.Nothing; Just a -> Strict.Just a)
 
-#elif MIN_VERSION_ghc(9,0,0)
-pattern RealSrcSpan x y = SrcLoc.RealSrcSpan x y
 #else
-pattern RealSrcSpan x y <- ((,Nothing) -> (SrcLoc.RealSrcSpan x, y)) where
-    RealSrcSpan x _ = SrcLoc.RealSrcSpan x
+pattern RealSrcSpan x y = SrcLoc.RealSrcSpan x y
 #endif
 {-# COMPLETE RealSrcSpan, UnhelpfulSpan #-}
 
@@ -790,12 +626,7 @@
 #else
 pattern RealSrcLoc :: SrcLoc.RealSrcLoc -> Maybe BufPos-> SrcLoc.SrcLoc
 #endif
-#if MIN_VERSION_ghc(9,0,0)
 pattern RealSrcLoc x y = SrcLoc.RealSrcLoc x y
-#else
-pattern RealSrcLoc x y <- ((,Nothing) -> (SrcLoc.RealSrcLoc x, y)) where
-    RealSrcLoc x _ = SrcLoc.RealSrcLoc x
-#endif
 {-# COMPLETE RealSrcLoc, UnhelpfulLoc #-}
 
 
@@ -839,7 +670,6 @@
 pattern FunTy :: Type -> Type -> Type
 pattern FunTy arg res <- TyCoRep.FunTy {ft_arg = arg, ft_res = res}
 
-#if MIN_VERSION_ghc(8,10,0)
 -- type HasSrcSpan x a = (GenLocated SrcSpan a ~ x)
 -- type HasSrcSpan x = () :: Constraint
 
@@ -863,35 +693,11 @@
 {-# COMPLETE L #-}
 #endif
 
-#else
-type HasSrcSpan = SrcLoc.HasSrcSpan
-getLoc :: SrcLoc.HasSrcSpan a => a -> SrcLoc.SrcSpan
-getLoc = SrcLoc.getLoc
-#endif
-
 -- | Add the @-boot@ suffix to all output file paths associated with the
 -- module, not including the input file itself
 addBootSuffixLocnOut :: GHC.ModLocation -> GHC.ModLocation
 addBootSuffixLocnOut = Module.addBootSuffixLocnOut
 
-#if !MIN_VERSION_ghc(9,0,0)
--- Linear Haskell
-type Scaled a = a
-scaledThing :: Scaled a -> a
-scaledThing = id
-
-unrestricted :: a -> Scaled a
-unrestricted = id
-#endif
-
-mkInfForAllTys :: [TyVar] -> Type -> Type
-mkInfForAllTys =
-#if MIN_VERSION_ghc(9,0,0)
-  TcType.mkInfForAllTys
-#else
-  mkInvForAllTys
-#endif
-
 #if !MIN_VERSION_ghc(9,2,0)
 splitForAllTyCoVars :: Type -> ([TyCoVar], Type)
 splitForAllTyCoVars =
@@ -915,14 +721,6 @@
   tcSplitForAllTy_maybe
 #endif
 
-
-#if !MIN_VERSION_ghc(9,0,0)
-pattern NotBoot, IsBoot :: IsBootInterface
-pattern NotBoot = False
-pattern IsBoot = True
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 -- This is from the old api, but it still simplifies
 pattern ConPatIn :: SrcLoc.Located (ConLikeP GhcPs) -> HsConPatDetails GhcPs -> Pat GhcPs
 #if MIN_VERSION_ghc(9,2,0)
@@ -932,36 +730,17 @@
 #else
 pattern ConPatIn con args = ConPat NoExtField con args
 #endif
-#endif
 
 conPatDetails :: Pat p -> Maybe (HsConPatDetails p)
-#if MIN_VERSION_ghc(9,0,0)
 conPatDetails (ConPat _ _ args) = Just args
 conPatDetails _ = Nothing
-#else
-conPatDetails (ConPatIn _ args) = Just args
-conPatDetails _ = Nothing
-#endif
 
 mapConPatDetail :: (HsConPatDetails p -> Maybe (HsConPatDetails p)) -> Pat p -> Maybe (Pat p)
-#if MIN_VERSION_ghc(9,0,0)
 mapConPatDetail f pat@(ConPat _ _ args) = (\args' -> pat { pat_args = args'}) <$> f args
 mapConPatDetail _ _ = Nothing
-#else
-mapConPatDetail f (ConPatIn ss args) = ConPatIn ss <$> f args
-mapConPatDetail _ _ = Nothing
-#endif
 
 
-initDynLinker, initObjLinker :: HscEnv -> IO ()
-initDynLinker =
-#if !MIN_VERSION_ghc(9,0,0)
-    Linker.initDynLinker
-#else
-    -- It errors out in GHC 9.0 and doesn't exist in 9.2
-    const $ return ()
-#endif
-
+initObjLinker :: HscEnv -> IO ()
 initObjLinker env =
 #if !MIN_VERSION_ghc(9,2,0)
     GHCi.initObjLinker env
@@ -1141,12 +920,6 @@
 #if !MIN_VERSION_ghc_boot_th(9,4,1)
 pattern NamedFieldPuns :: Extension
 pattern NamedFieldPuns = RecordPuns
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
-type UniqFM = UniqFM.UniqFM
-#else
-type UniqFM k = UniqFM.UniqFM
 #endif
 
 #if MIN_VERSION_ghc(9,5,0)
diff --git a/src/Development/IDE/GHC/Compat/Env.hs b/src/Development/IDE/GHC/Compat/Env.hs
--- a/src/Development/IDE/GHC/Compat/Env.hs
+++ b/src/Development/IDE/GHC/Compat/Env.hs
@@ -57,20 +57,11 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import           DynFlags
-import           Hooks
-import           HscTypes                            as Env
-import           Module
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import           GHC.Driver.Hooks                    (Hooks)
 import           GHC.Driver.Session                  hiding (mkHomeModule)
 import           GHC.Unit.Types                      (Module, UnitId)
-#endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 import qualified Data.Set                            as Set
 import qualified GHC.Driver.Session                  as DynFlags
 import           GHC.Driver.Types                    (HscEnv,
@@ -78,12 +69,11 @@
                                                       hsc_EPS,
                                                       setInteractivePrintName)
 import qualified GHC.Driver.Types                    as Env
-import           GHC.Driver.Ways                     hiding (hostFullWays)
-import qualified GHC.Driver.Ways                     as Ways
+import           GHC.Driver.Ways
 import           GHC.Unit.Types                      (Unit, mkModule)
 #endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,5,0)
+#if !MIN_VERSION_ghc(9,5,0)
 import           GHC.Unit.Module.Name
 #endif
 
@@ -95,8 +85,7 @@
 import           GHC.Driver.Backend                  as Backend
 import qualified GHC.Driver.Env                      as Env
 import qualified GHC.Driver.Session                  as Session
-import           GHC.Platform.Ways                   hiding (hostFullWays)
-import qualified GHC.Platform.Ways                   as Ways
+import           GHC.Platform.Ways
 import           GHC.Runtime.Context
 import           GHC.Unit.Env                        (UnitEnv)
 import           GHC.Unit.Home                       as Home
@@ -130,10 +119,8 @@
 setHomeUnitId_ :: UnitId -> DynFlags -> DynFlags
 #if MIN_VERSION_ghc(9,2,0)
 setHomeUnitId_ uid df = df { Session.homeUnitId_ = uid }
-#elif MIN_VERSION_ghc(9,0,0)
-setHomeUnitId_ uid df = df { homeUnitId = uid }
 #else
-setHomeUnitId_ uid df = df { thisInstalledUnitId = toInstalledUnitId uid }
+setHomeUnitId_ uid df = df { homeUnitId = uid }
 #endif
 
 hscSetFlags :: DynFlags -> HscEnv -> HscEnv
@@ -202,10 +189,8 @@
 homeUnitId_ =
 #if MIN_VERSION_ghc(9,2,0)
   Session.homeUnitId_
-#elif MIN_VERSION_ghc(9,0,0)
-  homeUnitId
 #else
-  thisPackage
+  homeUnitId
 #endif
 
 safeImportsOn :: DynFlags -> Bool
@@ -216,20 +201,16 @@
   DynFlags.safeImportsOn
 #endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 type HomeUnit = Unit
-#elif !MIN_VERSION_ghc(9,0,0)
-type HomeUnit = UnitId
 #endif
 
 hscHomeUnit :: HscEnv -> HomeUnit
 hscHomeUnit =
 #if MIN_VERSION_ghc(9,2,0)
   Env.hsc_home_unit
-#elif MIN_VERSION_ghc(9,0,0)
-  homeUnit . Env.hsc_dflags
 #else
-  homeUnitId_ . hsc_dflags
+  homeUnit . Env.hsc_dflags
 #endif
 
 mkHomeModule :: HomeUnit -> ModuleName -> Module
@@ -273,28 +254,16 @@
 -- Ways helpers
 -- -------------------------------------------------------
 
-#if !MIN_VERSION_ghc(9,2,0) && MIN_VERSION_ghc(9,0,0)
+#if !MIN_VERSION_ghc(9,2,0)
 type Ways = Set.Set Way
-#elif !MIN_VERSION_ghc(9,0,0)
-type Ways = [Way]
 #endif
 
-hostFullWays :: Ways
-hostFullWays =
-#if MIN_VERSION_ghc(9,0,0)
-  Ways.hostFullWays
-#else
-  interpWays
-#endif
-
 setWays :: Ways -> DynFlags -> DynFlags
 setWays newWays flags =
 #if MIN_VERSION_ghc(9,2,0)
   flags { Session.targetWays_ = newWays}
-#elif MIN_VERSION_ghc(9,0,0)
-  flags {ways = newWays}
 #else
-  updateWays $ flags {ways = newWays}
+  flags {ways = newWays}
 #endif
 
 -- -------------------------------------------------------
diff --git a/src/Development/IDE/GHC/Compat/Iface.hs b/src/Development/IDE/GHC/Compat/Iface.hs
--- a/src/Development/IDE/GHC/Compat/Iface.hs
+++ b/src/Development/IDE/GHC/Compat/Iface.hs
@@ -12,13 +12,7 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import           Finder                                (FindResult)
-import qualified Finder
-import qualified MkIface
-#endif
-
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 import qualified GHC.Driver.Finder                     as Finder
 import           GHC.Driver.Types                      (FindResult)
 import qualified GHC.Iface.Load                        as Iface
@@ -38,10 +32,8 @@
 writeIfaceFile env fp iface = Iface.writeIface (hsc_logger env) (targetProfile $ hsc_dflags env) fp iface
 #elif MIN_VERSION_ghc(9,2,0)
 writeIfaceFile env fp iface = Iface.writeIface (hsc_logger env) (hsc_dflags env) fp iface
-#elif MIN_VERSION_ghc(9,0,0)
-writeIfaceFile env = Iface.writeIface (hsc_dflags env)
 #else
-writeIfaceFile env = MkIface.writeIfaceFile (hsc_dflags env)
+writeIfaceFile env = Iface.writeIface (hsc_dflags env)
 #endif
 
 cannotFindModule :: HscEnv -> ModuleName -> FindResult -> SDoc
diff --git a/src/Development/IDE/GHC/Compat/Logger.hs b/src/Development/IDE/GHC/Compat/Logger.hs
--- a/src/Development/IDE/GHC/Compat/Logger.hs
+++ b/src/Development/IDE/GHC/Compat/Logger.hs
@@ -15,16 +15,9 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import           DynFlags
-import           Outputable                            (queryQual)
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import           GHC.Utils.Outputable
-#endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 import           GHC.Driver.Session                    as DynFlags
 #endif
 
@@ -66,17 +59,10 @@
 logActionCompat logAction logFlags _cls loc = logAction logFlags Nothing Nothing loc alwaysQualify
 
 #else
-#if MIN_VERSION_ghc(9,0,0)
 type LogActionCompat = DynFlags -> WarnReason -> Severity -> SrcSpan -> PrintUnqualified -> SDoc -> IO ()
 
 -- alwaysQualify seems to still do the right thing here, according to the "unqualified warnings" test.
 logActionCompat :: LogActionCompat -> LogAction
 logActionCompat logAction dynFlags wr severity loc = logAction dynFlags wr severity loc alwaysQualify
 
-#else
-type LogActionCompat = DynFlags -> WarnReason -> Severity -> SrcSpan -> PrintUnqualified -> SDoc -> IO ()
-
-logActionCompat :: LogActionCompat -> LogAction
-logActionCompat logAction dynFlags wr severity loc style = logAction dynFlags wr severity loc (queryQual style)
-#endif
 #endif
diff --git a/src/Development/IDE/GHC/Compat/Outputable.hs b/src/Development/IDE/GHC/Compat/Outputable.hs
--- a/src/Development/IDE/GHC/Compat/Outputable.hs
+++ b/src/Development/IDE/GHC/Compat/Outputable.hs
@@ -51,50 +51,35 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import           Development.IDE.GHC.Compat.Core (GlobalRdrEnv)
-import           DynFlags
-import           ErrUtils                        hiding (mkWarnMsg)
-import qualified ErrUtils                        as Err
-import           HscTypes
-import           Outputable                      as Out hiding
-                                                        (defaultUserStyle)
-import qualified Outputable                      as Out
-import           SrcLoc
-#endif
-
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 import           GHC.Driver.Session
-import           GHC.Driver.Types                as HscTypes
-import           GHC.Types.Name.Reader           (GlobalRdrEnv)
+import           GHC.Driver.Types             as HscTypes
+import           GHC.Types.Name.Reader        (GlobalRdrEnv)
 import           GHC.Types.SrcLoc
-import           GHC.Utils.Error                 as Err hiding (mkWarnMsg)
-import qualified GHC.Utils.Error                 as Err
-import           GHC.Utils.Outputable            as Out hiding
-                                                        (defaultUserStyle)
-import qualified GHC.Utils.Outputable            as Out
+import           GHC.Utils.Error              as Err hiding (mkWarnMsg)
+import qualified GHC.Utils.Error              as Err
+import           GHC.Utils.Outputable         as Out
+import qualified GHC.Utils.Outputable         as Out
 #endif
 
 #if MIN_VERSION_ghc(9,2,0)
 import           GHC.Driver.Env
 import           GHC.Driver.Ppr
 import           GHC.Driver.Session
-import qualified GHC.Types.Error                 as Error
+import qualified GHC.Types.Error              as Error
 import           GHC.Types.Name.Ppr
 import           GHC.Types.Name.Reader
 import           GHC.Types.SourceError
 import           GHC.Types.SrcLoc
 import           GHC.Unit.State
-import           GHC.Utils.Error                 hiding (mkWarnMsg)
-import           GHC.Utils.Outputable            as Out hiding
-                                                        (defaultUserStyle)
-import qualified GHC.Utils.Outputable            as Out
+import           GHC.Utils.Error              hiding (mkWarnMsg)
+import           GHC.Utils.Outputable         as Out
 import           GHC.Utils.Panic
 #endif
 
 #if MIN_VERSION_ghc(9,2,0) && !MIN_VERSION_ghc(9,3,0)
 import           GHC.Parser.Errors
-import qualified GHC.Parser.Errors.Ppr           as Ppr
+import qualified GHC.Parser.Errors.Ppr        as Ppr
 #endif
 
 #if MIN_VERSION_ghc(9,3,0)
@@ -104,7 +89,7 @@
 #endif
 
 #if MIN_VERSION_ghc(9,5,0)
-import           GHC.Driver.Errors.Types         (GhcMessage)
+import           GHC.Driver.Errors.Types      (GhcMessage)
 #endif
 
 #if MIN_VERSION_ghc(9,5,0)
@@ -144,7 +129,7 @@
     showSDocForUser unsafeGlobalDynFlags unqual doc
 #endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 oldRenderWithStyle dflags sdoc sty = Out.renderWithStyle (initSDocContext dflags sty) sdoc
 oldMkUserStyle _ = Out.mkUserStyle
 oldMkErrStyle _ = Out.mkErrStyle
@@ -152,18 +137,6 @@
 oldFormatErrDoc :: DynFlags -> Err.ErrDoc -> Out.SDoc
 oldFormatErrDoc dflags = Err.formatErrDoc dummySDocContext
   where dummySDocContext = initSDocContext dflags Out.defaultUserStyle
-#elif !MIN_VERSION_ghc(9,0,0)
-oldRenderWithStyle :: DynFlags -> Out.SDoc -> Out.PprStyle -> String
-oldRenderWithStyle = Out.renderWithStyle
-
-oldMkUserStyle :: DynFlags -> Out.PrintUnqualified -> Out.Depth -> Out.PprStyle
-oldMkUserStyle = Out.mkUserStyle
-
-oldMkErrStyle :: DynFlags -> Out.PrintUnqualified -> Out.PprStyle
-oldMkErrStyle = Out.mkErrStyle
-
-oldFormatErrDoc :: DynFlags -> Err.ErrDoc -> Out.SDoc
-oldFormatErrDoc = Err.formatErrDoc
 #endif
 
 #if !MIN_VERSION_ghc(9,3,0)
@@ -263,13 +236,6 @@
 #else
   Err.mkWarnMsg
 #endif
-#endif
-
-defaultUserStyle :: PprStyle
-#if MIN_VERSION_ghc(9,0,0)
-defaultUserStyle = Out.defaultUserStyle
-#else
-defaultUserStyle = Out.defaultUserStyle unsafeGlobalDynFlags
 #endif
 
 textDoc :: String -> SDoc
diff --git a/src/Development/IDE/GHC/Compat/Parser.hs b/src/Development/IDE/GHC/Compat/Parser.hs
--- a/src/Development/IDE/GHC/Compat/Parser.hs
+++ b/src/Development/IDE/GHC/Compat/Parser.hs
@@ -6,7 +6,7 @@
 module Development.IDE.GHC.Compat.Parser (
     initParserOpts,
     initParserState,
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
     -- in GHC == 9.2 the type doesn't exist
     -- In GHC == 9.0 it is a data-type
     -- and GHC < 9.0 it is type-def
@@ -16,9 +16,7 @@
 #else
     ApiAnns,
 #endif
-#if MIN_VERSION_ghc(9,0,0)
     PsSpan(..),
-#endif
 #if MIN_VERSION_ghc(9,2,0)
     pattern HsParsedModule,
     type GHC.HsParsedModule,
@@ -50,20 +48,11 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import qualified ApiAnnotation                   as Anno
-import qualified HscTypes                        as GHC
-import           Lexer
-import qualified SrcLoc
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import qualified GHC.Parser.Annotation           as Anno
 import qualified GHC.Parser.Lexer                as Lexer
 import           GHC.Types.SrcLoc                (PsSpan (..))
-#endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 import qualified GHC.Driver.Types                as GHC
 #endif
 
@@ -90,9 +79,7 @@
 #endif
 
 
-#if !MIN_VERSION_ghc(9,0,0)
-type ParserOpts = DynFlags
-#elif !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 type ParserOpts = Lexer.ParserFlags
 #endif
 
@@ -100,20 +87,16 @@
 initParserOpts =
 #if MIN_VERSION_ghc(9,2,0)
   Config.initParserOpts
-#elif MIN_VERSION_ghc(9,0,0)
-  Lexer.mkParserFlags
 #else
-  id
+  Lexer.mkParserFlags
 #endif
 
 initParserState :: ParserOpts -> StringBuffer -> RealSrcLoc -> PState
 initParserState =
 #if MIN_VERSION_ghc(9,2,0)
   Lexer.initParserState
-#elif MIN_VERSION_ghc(9,0,0)
-  Lexer.mkPStatePure
 #else
-  Lexer.mkPState
+  Lexer.mkPStatePure
 #endif
 
 #if MIN_VERSION_ghc(9,2,0)
@@ -164,7 +147,6 @@
 mkApiAnns = const ()
 #else
 mkApiAnns pst =
-#if MIN_VERSION_ghc(9,0,1)
     -- Copied from GHC.Driver.Main
     Anno.ApiAnns {
             apiAnnItems = Map.fromListWith (++) $ annotations pst,
@@ -172,11 +154,6 @@
             apiAnnComments = Map.fromList (annotations_comments pst),
             apiAnnRogueComments = comment_q pst
         }
-#else
-    (Map.fromListWith (++) $ annotations pst,
-     Map.fromList ((SrcLoc.noSrcSpan,comment_q pst)
-                  :annotations_comments pst))
-#endif
 #endif
 
 #if !MIN_VERSION_ghc(9,2,0)
diff --git a/src/Development/IDE/GHC/Compat/Plugins.hs b/src/Development/IDE/GHC/Compat/Plugins.hs
--- a/src/Development/IDE/GHC/Compat/Plugins.hs
+++ b/src/Development/IDE/GHC/Compat/Plugins.hs
@@ -25,21 +25,14 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import qualified DynamicLoading                        as Loader
-import           Plugins
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import           GHC.Driver.Plugins                    (Plugin (..),
                                                         PluginWithArgs (..),
                                                         StaticPlugin (..),
                                                         defaultPlugin,
                                                         withPlugins)
 import qualified GHC.Runtime.Loader                    as Loader
-#endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,3,0)
+#if !MIN_VERSION_ghc(9,3,0)
 import           Development.IDE.GHC.Compat.Outputable as Out
 #endif
 
diff --git a/src/Development/IDE/GHC/Compat/Units.hs b/src/Development/IDE/GHC/Compat/Units.hs
--- a/src/Development/IDE/GHC/Compat/Units.hs
+++ b/src/Development/IDE/GHC/Compat/Units.hs
@@ -26,7 +26,7 @@
     unitExposedModules,
     unitDepends,
     unitHaddockInterfaces,
-    unitInfoId,
+    mkUnit,
     unitPackageNameString,
     unitPackageVersion,
     -- * UnitId helpers
@@ -34,9 +34,6 @@
     Unit,
     unitString,
     stringToUnit,
-#if !MIN_VERSION_ghc(9,0,0)
-    pattern RealUnit,
-#endif
     definiteUnitId,
     defUnitId,
     installedModule,
@@ -54,7 +51,6 @@
     ) where
 
 import           Data.Either
-import           Data.Version
 import           Development.IDE.GHC.Compat.Core
 import           Development.IDE.GHC.Compat.Env
 import           Development.IDE.GHC.Compat.Outputable
@@ -62,42 +58,27 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import qualified DynFlags
-import           FastString
-import qualified Finder                                as GHC
-import           HscTypes
-import           Module                                hiding (moduleUnitId)
-import qualified Module
-import           Packages                              (InstalledPackageInfo (haddockInterfaces, packageName),
-                                                        LookupResult,
-                                                        PackageConfig,
-                                                        PackageConfigMap,
-                                                        PackageState,
-                                                        getPackageConfigMap,
-                                                        lookupPackage')
-import qualified Packages
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import           GHC.Types.Unique.Set
 import qualified GHC.Unit.Info                         as UnitInfo
 import           GHC.Unit.State                        (LookupResult, UnitInfo,
-                                                        UnitState (unitInfoMap))
+                                                        UnitState (unitInfoMap),
+                                                        lookupUnit', mkUnit,
+                                                        unitDepends,
+                                                        unitExposedModules,
+                                                        unitPackageNameString,
+                                                        unitPackageVersion)
 import qualified GHC.Unit.State                        as State
-import           GHC.Unit.Types                        hiding (moduleUnit,
-                                                        toUnitId)
+import           GHC.Unit.Types
 import qualified GHC.Unit.Types                        as Unit
-#endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 import           Data.Map                              (Map)
 import qualified GHC.Driver.Finder                     as GHC
 import qualified GHC.Driver.Session                    as DynFlags
 import           GHC.Driver.Types
 #endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,3,0)
+#if !MIN_VERSION_ghc(9,3,0)
 import           GHC.Data.FastString
 
 #endif
@@ -125,37 +106,18 @@
 #endif
 
 
-#if MIN_VERSION_ghc(9,0,0)
 type PreloadUnitClosure = UniqSet UnitId
 #if MIN_VERSION_ghc(9,2,0)
 type UnitInfoMap = State.UnitInfoMap
 #else
 type UnitInfoMap = Map UnitId UnitInfo
 #endif
-#else
-type UnitState = PackageState
-type UnitInfo = PackageConfig
-type UnitInfoMap = PackageConfigMap
-type PreloadUnitClosure = ()
-type Unit = UnitId
-#endif
 
-
-#if !MIN_VERSION_ghc(9,0,0)
-unitString :: Unit -> String
-unitString = Module.unitIdString
-
-stringToUnit :: String -> Unit
-stringToUnit = Module.stringToUnitId
-#endif
-
 unitState :: HscEnv -> UnitState
 #if MIN_VERSION_ghc(9,2,0)
 unitState = ue_units . hsc_unit_env
-#elif MIN_VERSION_ghc(9,0,0)
-unitState = DynFlags.unitState . hsc_dflags
 #else
-unitState = DynFlags.pkgState . hsc_dflags
+unitState = DynFlags.unitState . hsc_dflags
 #endif
 
 #if MIN_VERSION_ghc(9,3,0)
@@ -206,13 +168,9 @@
 oldInitUnits :: DynFlags -> IO DynFlags
 #if MIN_VERSION_ghc(9,2,0)
 oldInitUnits = pure
-#elif MIN_VERSION_ghc(9,0,0)
-oldInitUnits dflags = do
-  newFlags <- State.initUnits dflags
-  pure newFlags
 #else
 oldInitUnits dflags = do
-  newFlags <- fmap fst $ Packages.initPackages dflags
+  newFlags <- State.initUnits dflags
   pure newFlags
 #endif
 
@@ -220,27 +178,17 @@
 explicitUnits ue =
 #if MIN_VERSION_ghc(9,3,0)
   map fst $ State.explicitUnits ue
-#elif MIN_VERSION_ghc(9,0,0)
-  State.explicitUnits ue
 #else
-  Packages.explicitPackages ue
+  State.explicitUnits ue
 #endif
 
 listVisibleModuleNames :: HscEnv -> [ModuleName]
 listVisibleModuleNames env =
-#if MIN_VERSION_ghc(9,0,0)
   State.listVisibleModuleNames $ unitState env
-#else
-  Packages.listVisibleModuleNames $ hsc_dflags env
-#endif
 
 getUnitName :: HscEnv -> UnitId -> Maybe PackageName
 getUnitName env i =
-#if MIN_VERSION_ghc(9,0,0)
   State.unitPackageName <$> State.lookupUnitId (unitState env) i
-#else
-  packageName <$> Packages.lookupPackage (hsc_dflags env) (definiteUnitId (defUnitId i))
-#endif
 
 lookupModuleWithSuggestions
   :: HscEnv
@@ -252,92 +200,28 @@
 #endif
   -> LookupResult
 lookupModuleWithSuggestions env modname mpkg =
-#if MIN_VERSION_ghc(9,0,0)
   State.lookupModuleWithSuggestions (unitState env) modname mpkg
-#else
-  Packages.lookupModuleWithSuggestions (hsc_dflags env) modname mpkg
-#endif
 
 getUnitInfoMap :: HscEnv -> UnitInfoMap
 getUnitInfoMap =
 #if MIN_VERSION_ghc(9,2,0)
   unitInfoMap . ue_units . hsc_unit_env
-#elif MIN_VERSION_ghc(9,0,0)
-  unitInfoMap . unitState
 #else
-  Packages.getPackageConfigMap . hsc_dflags
+  unitInfoMap . unitState
 #endif
 
 lookupUnit :: HscEnv -> Unit -> Maybe UnitInfo
-#if MIN_VERSION_ghc(9,0,0)
 lookupUnit env pid = State.lookupUnit (unitState env) pid
-#else
-lookupUnit env pid = Packages.lookupPackage (hsc_dflags env) pid
-#endif
 
-lookupUnit' :: Bool -> UnitInfoMap -> PreloadUnitClosure -> Unit -> Maybe UnitInfo
-#if MIN_VERSION_ghc(9,0,0)
-lookupUnit' = State.lookupUnit'
-#else
-lookupUnit' b pcm _ u = Packages.lookupPackage' b pcm u
-#endif
-
 preloadClosureUs :: HscEnv -> PreloadUnitClosure
-#if MIN_VERSION_ghc(9,2,0)
 preloadClosureUs = State.preloadClosure . unitState
-#elif MIN_VERSION_ghc(9,0,0)
-preloadClosureUs = State.preloadClosure . unitState
-#else
-preloadClosureUs = const ()
-#endif
 
-unitExposedModules :: UnitInfo -> [(ModuleName, Maybe Module)]
-unitExposedModules ue =
-#if MIN_VERSION_ghc(9,0,0)
-  UnitInfo.unitExposedModules ue
-#else
-  Packages.exposedModules ue
-#endif
-
-unitDepends :: UnitInfo -> [UnitId]
-#if MIN_VERSION_ghc(9,0,0)
-unitDepends = State.unitDepends
-#else
-unitDepends = fmap (Module.DefiniteUnitId. defUnitId') . Packages.depends
-#endif
-
-unitPackageNameString :: UnitInfo -> String
-unitPackageNameString =
-#if MIN_VERSION_ghc(9,0,0)
-  UnitInfo.unitPackageNameString
-#else
-  Packages.packageNameString
-#endif
-
-unitPackageVersion :: UnitInfo -> Version
-unitPackageVersion =
-#if MIN_VERSION_ghc(9,0,0)
-  UnitInfo.unitPackageVersion
-#else
-  Packages.packageVersion
-#endif
-
-unitInfoId :: UnitInfo -> Unit
-unitInfoId =
-#if MIN_VERSION_ghc(9,0,0)
-  UnitInfo.mkUnit
-#else
-  Packages.packageConfigId
-#endif
-
 unitHaddockInterfaces :: UnitInfo -> [FilePath]
 unitHaddockInterfaces =
 #if MIN_VERSION_ghc(9,2,0)
   fmap ST.unpack . UnitInfo.unitHaddockInterfaces
-#elif MIN_VERSION_ghc(9,0,0)
-  UnitInfo.unitHaddockInterfaces
 #else
-  haddockInterfaces
+  UnitInfo.unitHaddockInterfaces
 #endif
 
 -- ------------------------------------------------------------------
@@ -356,67 +240,26 @@
 installedModule :: unit -> ModuleName -> GenModule unit
 installedModule        = Module
 
-#elif MIN_VERSION_ghc(9,0,0)
+#else
 definiteUnitId         = RealUnit
 defUnitId              = Definite
 installedModule        = Module
 
-#else
-pattern RealUnit :: Module.DefUnitId -> UnitId
-pattern RealUnit x = Module.DefiniteUnitId x
-
-definiteUnitId :: Module.DefUnitId -> UnitId
-definiteUnitId = Module.DefiniteUnitId
-
-defUnitId :: UnitId -> Module.DefUnitId
-defUnitId = Module.DefUnitId . Module.toInstalledUnitId
-
-defUnitId' :: Module.InstalledUnitId -> Module.DefUnitId
-defUnitId' = Module.DefUnitId
-
-installedModule :: UnitId -> ModuleName -> Module.InstalledModule
-installedModule uid modname = Module.InstalledModule (Module.toInstalledUnitId uid) modname
 #endif
 
-toUnitId :: Unit -> UnitId
-toUnitId =
-#if MIN_VERSION_ghc(9,0,0)
-    Unit.toUnitId
-#else
-    id
-#endif
-
 moduleUnitId :: Module -> UnitId
 moduleUnitId =
-#if MIN_VERSION_ghc(9,0,0)
     Unit.toUnitId . Unit.moduleUnit
-#else
-    Module.moduleUnitId
-#endif
 
-moduleUnit :: Module -> Unit
-moduleUnit =
-#if MIN_VERSION_ghc(9,0,0)
-    Unit.moduleUnit
-#else
-    Module.moduleUnitId
-#endif
-
 filterInplaceUnits :: [UnitId] -> [PackageFlag] -> ([UnitId], [PackageFlag])
 filterInplaceUnits us packageFlags =
   partitionEithers (map isInplace packageFlags)
   where
     isInplace :: PackageFlag -> Either UnitId PackageFlag
     isInplace p@(ExposePackage _ (UnitIdArg u) _) =
-#if MIN_VERSION_ghc(9,0,0)
       if toUnitId u `elem` us
         then Left $ toUnitId  u
         else Right p
-#else
-      if u `elem` us
-        then Left u
-        else Right p
-#endif
     isInplace p = Right p
 
 showSDocForUser' :: HscEnv -> PrintUnqualified -> SDoc -> String
diff --git a/src/Development/IDE/GHC/Compat/Util.hs b/src/Development/IDE/GHC/Compat/Util.hs
--- a/src/Development/IDE/GHC/Compat/Util.hs
+++ b/src/Development/IDE/GHC/Compat/Util.hs
@@ -71,24 +71,6 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import           Bag
-import           BooleanFormula
-import           EnumSet
-import qualified Exception
-import           FastString
-import           Fingerprint
-import           Maybes
-import           Outputable              (pprHsString)
-import           Pair
-import           Panic                   hiding (try)
-import           StringBuffer
-import           UniqDFM
-import           Unique
-import           Util
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import           Control.Exception.Safe  (MonadCatch, catch, try)
 import           GHC.Data.Bag
 import           GHC.Data.BooleanFormula
@@ -103,9 +85,8 @@
 import           GHC.Utils.Fingerprint
 import           GHC.Utils.Outputable    (pprHsString)
 import           GHC.Utils.Panic         hiding (try)
-#endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,3,0)
+#if !MIN_VERSION_ghc(9,3,0)
 import           GHC.Utils.Misc
 #endif
 
@@ -113,14 +94,3 @@
 import           GHC.Data.Bool
 #endif
 
-
-#if !MIN_VERSION_ghc(9,0,0)
-type MonadCatch = Exception.ExceptionMonad
-
--- We are using Safe here, which is not equivalent, but probably what we want.
-catch :: (Exception.ExceptionMonad m, Exception e) => m a -> (e -> m a) -> m a
-catch = Exception.gcatch
-
-try :: (Exception.ExceptionMonad m, Exception e) => m a -> m (Either e a)
-try = Exception.gtry
-#endif
diff --git a/src/Development/IDE/GHC/CoreFile.hs b/src/Development/IDE/GHC/CoreFile.hs
--- a/src/Development/IDE/GHC/CoreFile.hs
+++ b/src/Development/IDE/GHC/CoreFile.hs
@@ -27,19 +27,6 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import           Binary
-import           BinFingerprint                  (fingerprintBinMem)
-import           BinIface
-import           CoreSyn
-import           HscTypes
-import           IfaceEnv
-import           MkId
-import           TcIface
-import           ToIface
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import           GHC.Core
 import           GHC.CoreToIface
 import           GHC.Iface.Binary
@@ -48,9 +35,8 @@
 import           GHC.IfaceToCore
 import           GHC.Types.Id.Make
 import           GHC.Utils.Binary
-#endif
 
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,2,0)
+#if !MIN_VERSION_ghc(9,2,0)
 import           GHC.Driver.Types
 #endif
 
diff --git a/src/Development/IDE/GHC/Orphans.hs b/src/Development/IDE/GHC/Orphans.hs
--- a/src/Development/IDE/GHC/Orphans.hs
+++ b/src/Development/IDE/GHC/Orphans.hs
@@ -20,24 +20,13 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import           Bag
-import           ByteCodeTypes
-import           GhcPlugins                 hiding (UniqFM)
-import qualified StringBuffer               as SB
-import           Unique                     (getKey)
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import           GHC.ByteCode.Types
 import           GHC.Data.Bag
 import           GHC.Data.FastString
 import qualified GHC.Data.StringBuffer      as SB
 import           GHC.Types.SrcLoc
 
-#endif
-
-#if MIN_VERSION_ghc(9,0,0) && !MIN_VERSION_ghc(9,3,0)
+#if !MIN_VERSION_ghc(9,3,0)
 import           GHC                        (ModuleGraph)
 import           GHC.Types.Unique           (getKey)
 #endif
@@ -78,22 +67,9 @@
 instance Show InteractiveImport where show = unpack . printOutputable
 instance Show PackageName  where show = unpack . printOutputable
 
-#if !MIN_VERSION_ghc(9,0,1)
-instance Show ComponentId  where show = unpack . printOutputable
-instance Show SourcePackageId  where show = unpack . printOutputable
-
-instance Show GhcPlugins.InstalledUnitId where
-    show = installedUnitIdString
-
-instance NFData GhcPlugins.InstalledUnitId where rnf = rwhnf . installedUnitIdFS
-
-instance Hashable GhcPlugins.InstalledUnitId where
-  hashWithSalt salt = hashWithSalt salt . installedUnitIdString
-#else
 instance Show UnitId where show = unpack . printOutputable
 deriving instance Ord SrcSpan
 deriving instance Ord UnhelpfulSpanReason
-#endif
 
 instance NFData SB.StringBuffer where rnf = rwhnf
 
@@ -213,10 +189,8 @@
 
 #if MIN_VERSION_ghc(9,5,0)
 instance (NFData (HsModule a)) where
-#elif MIN_VERSION_ghc(9,0,1)
-instance (NFData HsModule) where
 #else
-instance (NFData (HsModule a)) where
+instance (NFData HsModule) where
 #endif
   rnf = rwhnf
 
diff --git a/src/Development/IDE/GHC/Util.hs b/src/Development/IDE/GHC/Util.hs
--- a/src/Development/IDE/GHC/Util.hs
+++ b/src/Development/IDE/GHC/Util.hs
@@ -240,11 +240,7 @@
 
 -- | This is copied unmodified from GHC since it is not exposed.
 -- Note the beautiful inline comment!
-#if MIN_VERSION_ghc(9,0,0)
 dupHandle_ :: (RawIO dev, IODevice dev, BufferedIO dev, Typeable dev) => dev
-#else
-dupHandle_ :: (IODevice dev, BufferedIO dev, Typeable dev) => dev
-#endif
            -> FilePath
            -> Maybe (MVar Handle__)
            -> Handle__
diff --git a/src/Development/IDE/Import/FindImports.hs b/src/Development/IDE/Import/FindImports.hs
--- a/src/Development/IDE/Import/FindImports.hs
+++ b/src/Development/IDE/Import/FindImports.hs
@@ -183,11 +183,7 @@
 
     toModLocation uid file = liftIO $ do
         loc <- mkHomeModLocation dflags (unLoc modName) (fromNormalizedFilePath file)
-#if MIN_VERSION_ghc(9,0,0)
         let genMod = mkModule (RealUnit $ Definite uid) (unLoc modName)  -- TODO support backpack holes
-#else
-        let genMod = mkModule uid (unLoc modName)
-#endif
         return $ Right $ FileImport $ ArtifactsLocation file (Just loc) (not isSource) (Just genMod)
 
     lookupLocal uid dirs = do
diff --git a/src/Development/IDE/LSP/Outline.hs b/src/Development/IDE/LSP/Outline.hs
--- a/src/Development/IDE/LSP/Outline.hs
+++ b/src/Development/IDE/LSP/Outline.hs
@@ -280,11 +280,6 @@
 getConNames' :: ConDecl GhcPs -> [Located (IdP GhcPs)]
 getConNames' ConDeclH98  {con_name  = name}  = [name]
 getConNames' ConDeclGADT {con_names = names} = names
-#if !MIN_VERSION_ghc(8,10,0)
-getConNames' (XConDecl NoExt)                = []
-#elif !MIN_VERSION_ghc(9,0,0)
-getConNames' (XConDecl x)                    = noExtCon x
-#endif
 #else
 hsConDeclsBinders :: LConDecl GhcPs
                   -> ([LIdP GhcPs], [LFieldOcc GhcPs])
diff --git a/src/Development/IDE/Plugin/Completions/Types.hs b/src/Development/IDE/Plugin/Completions/Types.hs
--- a/src/Development/IDE/Plugin/Completions/Types.hs
+++ b/src/Development/IDE/Plugin/Completions/Types.hs
@@ -27,15 +27,7 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import qualified OccName                      as Occ
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import qualified GHC.Types.Name.Occurrence    as Occ
-#endif
-
-
 
 -- | Produce completions info for a file
 type instance RuleResult LocalCompletions = CachedCompletions
diff --git a/src/Development/IDE/Spans/AtPoint.hs b/src/Development/IDE/Spans/AtPoint.hs
--- a/src/Development/IDE/Spans/AtPoint.hs
+++ b/src/Development/IDE/Spans/AtPoint.hs
@@ -167,12 +167,8 @@
   -> MaybeT m [DocumentHighlight]
 documentHighlight hf rf pos = pure highlights
   where
-#if MIN_VERSION_ghc(9,0,1)
     -- We don't want to show document highlights for evidence variables, which are supposed to be invisible
     notEvidence = not . any isEvidenceContext . identInfo
-#else
-    notEvidence = const True
-#endif
     ns = concat $ pointCommand hf pos (rights . M.keys . M.filter notEvidence . getNodeIds)
     highlights = do
       n <- ns
@@ -245,12 +241,8 @@
 
         -- Check for evidence bindings
         isInternal :: (Identifier, IdentifierDetails a) -> Bool
-        isInternal (Right _, _dets) = -- dets is only used in GHC >= 9.0.1
-#if MIN_VERSION_ghc(9,0,1)
-          any isEvidenceContext $ identInfo _dets
-#else
-          False
-#endif
+        isInternal (Right _, dets) =
+          any isEvidenceContext $ identInfo dets
         isInternal (Left _, _) = False
 
         filteredNames :: [(Identifier, IdentifierDetails hietype)]
@@ -338,11 +330,7 @@
             HAppTy a (HieArgs xs) -> getTypes' (a : map snd xs)
             HTyConApp tc (HieArgs xs) -> ifaceTyConName tc : getTypes' (map snd xs)
             HForAllTy _ a -> getTypes' [a]
-#if MIN_VERSION_ghc(9,0,1)
             HFunTy a b c -> getTypes' [a,b,c]
-#else
-            HFunTy a b -> getTypes' [a,b]
-#endif
             HQualTy a b -> getTypes' [a,b]
             HCastTy a -> getTypes' [a]
             _ -> []
diff --git a/src/Development/IDE/Spans/Documentation.hs b/src/Development/IDE/Spans/Documentation.hs
--- a/src/Development/IDE/Spans/Documentation.hs
+++ b/src/Development/IDE/Spans/Documentation.hs
@@ -172,13 +172,7 @@
     sortedNameSpans :: [Located RdrName] -> [RealSrcSpan]
     sortedNameSpans ls = nubSort (mapMaybe (realSpan . getLoc) ls)
     isBetween target before after = before <= target && target <= after
-#if MIN_VERSION_ghc(9,0,0)
     ann = apiAnnComments . pm_annotations
-#else
-    ann = fmap filterReal . snd . pm_annotations
-    filterReal :: [Located a] -> [RealLocated a]
-    filterReal = mapMaybe (\(L l v) -> (`L`v) <$> realSpan l)
-#endif
     annotationFileName :: ParsedModule -> Maybe FastString
     annotationFileName = fmap srcSpanFile . listToMaybe . map getRealSrcSpan . fold . ann
 
diff --git a/src/Development/IDE/Spans/Pragmas.hs b/src/Development/IDE/Spans/Pragmas.hs
--- a/src/Development/IDE/Spans/Pragmas.hs
+++ b/src/Development/IDE/Spans/Pragmas.hs
@@ -303,11 +303,7 @@
 lexUntilNextLineIncl :: P (Located Token)
 lexUntilNextLineIncl = do
   PState{ last_loc } <- getPState
-#if MIN_VERSION_ghc(9,0,0)
   let PsSpan{ psRealSpan = lastRealSrcSpan } = last_loc
-#else
-  let lastRealSrcSpan = last_loc
-#endif
   let prevEndLine = lastRealSrcSpan & realSrcSpanEnd & srcLocLine
   locatedToken@(L srcSpan _token) <- lexer False pure
   if | RealSrcLoc currEndRealSrcLoc _ <- srcSpan & srcSpanEnd
diff --git a/src/Development/IDE/Types/HscEnvEq.hs b/src/Development/IDE/Types/HscEnvEq.hs
--- a/src/Development/IDE/Types/HscEnvEq.hs
+++ b/src/Development/IDE/Types/HscEnvEq.hs
@@ -91,7 +91,7 @@
                         -- When module is re-exported from another package,
                         -- the origin module is represented by value in Just
                         Just otherPkgMod -> otherPkgMod
-                        Nothing          -> mkModule (unitInfoId pkg) modName
+                        Nothing          -> mkModule (mkUnit pkg) modName
                 ]
 
             doOne m = do
diff --git a/src/Development/IDE/Types/Location.hs b/src/Development/IDE/Types/Location.hs
--- a/src/Development/IDE/Types/Location.hs
+++ b/src/Development/IDE/Types/Location.hs
@@ -38,15 +38,8 @@
 
 -- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
 
-#if !MIN_VERSION_ghc(9,0,0)
-import           FastString
-import           SrcLoc                       as GHC
-#endif
-
-#if MIN_VERSION_ghc(9,0,0)
 import           GHC.Data.FastString
 import           GHC.Types.SrcLoc             as GHC
-#endif
 
 toNormalizedFilePath' :: FilePath -> LSP.NormalizedFilePath
 -- We want to keep empty paths instead of normalising them to "."
diff --git a/test/exe/CompletionTests.hs b/test/exe/CompletionTests.hs
--- a/test/exe/CompletionTests.hs
+++ b/test/exe/CompletionTests.hs
@@ -261,7 +261,7 @@
       []
   ]
   where
-    brokenForWinGhc = knownBrokenFor (BrokenSpecific Windows [GHC810, GHC90, GHC92, GHC94, GHC96]) "Windows has strange things in scope for some reason"
+    brokenForWinGhc = knownBrokenFor (BrokenSpecific Windows [GHC90, GHC92, GHC94, GHC96]) "Windows has strange things in scope for some reason"
 
 otherCompletionTests :: [TestTree]
 otherCompletionTests = [
diff --git a/test/exe/FindDefinitionAndHoverTests.hs b/test/exe/FindDefinitionAndHoverTests.hs
--- a/test/exe/FindDefinitionAndHoverTests.hs
+++ b/test/exe/FindDefinitionAndHoverTests.hs
@@ -205,10 +205,7 @@
   , test  yes    yes    lclL33     lcb           "listcomp lookup"
   , test  yes    yes    mclL36     mcl           "top-level fn 1st clause"
   , test  yes    yes    mclL37     mcl           "top-level fn 2nd clause         #1030"
-  , if ghcVersion >= GHC810 then
-        test  yes    yes    spaceL37   space         "top-level fn on space           #1002"
-    else
-        test  yes    broken spaceL37   space         "top-level fn on space           #1002"
+  , test  yes    yes    spaceL37   space         "top-level fn on space           #1002"
   , test  no     yes    docL41     doc           "documentation                   #1129"
   , test  no     yes    eitL40     kindE         "kind of Either                  #1017"
   , test  no     yes    intL40     kindI         "kind of Int                     #1017"
diff --git a/test/exe/HighlightTests.hs b/test/exe/HighlightTests.hs
--- a/test/exe/HighlightTests.hs
+++ b/test/exe/HighlightTests.hs
@@ -50,19 +50,13 @@
         _ <- waitForDiagnostics
         highlights <- getHighlights doc (Position 4 15)
         liftIO $ highlights @?=
-          -- Span is just the .. on 8.10, but Rec{..} before
-          [ if ghcVersion >= GHC810
-            then DocumentHighlight (R 4 8 4 10) (Just DocumentHighlightKind_Write)
-            else DocumentHighlight (R 4 4 4 11) (Just DocumentHighlightKind_Write)
+          [ DocumentHighlight (R 4 8 4 10) (Just DocumentHighlightKind_Write)
           , DocumentHighlight (R 4 14 4 20) (Just DocumentHighlightKind_Read)
           ]
         highlights <- getHighlights doc (Position 3 17)
         liftIO $ highlights @?=
           [ DocumentHighlight (R 3 17 3 23) (Just DocumentHighlightKind_Write)
-          -- Span is just the .. on 8.10, but Rec{..} before
-          , if ghcVersion >= GHC810
-              then DocumentHighlight (R 4 8 4 10) (Just DocumentHighlightKind_Read)
-              else DocumentHighlight (R 4 4 4 11) (Just DocumentHighlightKind_Read)
+          , DocumentHighlight (R 4 8 4 10) (Just DocumentHighlightKind_Read)
           ]
   ]
   where
diff --git a/test/exe/PluginParsedResultTests.hs b/test/exe/PluginParsedResultTests.hs
--- a/test/exe/PluginParsedResultTests.hs
+++ b/test/exe/PluginParsedResultTests.hs
@@ -10,7 +10,6 @@
 
 tests :: TestTree
 tests =
-  ignoreInWindowsForGHC810 $
   ignoreForGHC92Plus "No need for this plugin anymore!" $
   testSessionWithExtraFiles "plugin-recorddot" "parsedResultAction plugin" $ \dir -> do
     _ <- openDoc (dir</> "RecordDot.hs") "haskell"
diff --git a/test/exe/PluginSimpleTests.hs b/test/exe/PluginSimpleTests.hs
--- a/test/exe/PluginSimpleTests.hs
+++ b/test/exe/PluginSimpleTests.hs
@@ -15,7 +15,6 @@
 
 tests :: TestTree
 tests =
-  ignoreInWindowsForGHC810 $
   -- Build profile: -w ghc-9.4.2 -O1
   -- In order, the following will be built (use -v for more details):
   -- - ghc-typelits-natnormalise-0.7.7 (lib) (requires build)
diff --git a/test/exe/TestUtils.hs b/test/exe/TestUtils.hs
--- a/test/exe/TestUtils.hs
+++ b/test/exe/TestUtils.hs
@@ -166,10 +166,6 @@
 ignoreInWindowsBecause :: String -> TestTree -> TestTree
 ignoreInWindowsBecause = ignoreFor (BrokenForOS Windows)
 
-ignoreInWindowsForGHC810 :: TestTree -> TestTree
-ignoreInWindowsForGHC810 =
-    ignoreFor (BrokenSpecific Windows [GHC810]) "tests are unreliable in windows for ghc 8.10"
-
 ignoreForGHC92Plus :: String -> TestTree -> TestTree
 ignoreForGHC92Plus = ignoreFor (BrokenForGHC [GHC92, GHC94, GHC96])
 
