diff --git a/LICENSE.markdown b/LICENSE.markdown
--- a/LICENSE.markdown
+++ b/LICENSE.markdown
@@ -1,4 +1,4 @@
-Copyright 2021 Taylor Fausak
+Copyright 2022 Taylor Fausak
 
 Permission to use, copy, modify, and/or distribute this software for any
 purpose with or without fee is hereby granted, provided that the above
diff --git a/splint.cabal b/splint.cabal
--- a/splint.cabal
+++ b/splint.cabal
@@ -1,7 +1,7 @@
 cabal-version: >= 1.10
 
 name: splint
-version: 1.0.1.4
+version: 1.0.1.5
 
 synopsis: HLint as a GHC source plugin.
 description:
@@ -25,8 +25,8 @@
   build-depends:
     base >= 4.13.0 && < 4.16
     , containers >= 0.6.2 && < 0.7
-    , ghc >= 8.8.4 && < 8.11 || >= 9.0.1 && < 9.1
-    , hlint >= 3.1.6 && < 3.4
+    , ghc >= 8.10 && < 8.11 || >= 9.0 && < 9.1
+    , hlint
     , stm >= 2.5.0 && < 2.6
   default-language: Haskell2010
   exposed-modules: Splint
@@ -37,23 +37,12 @@
     -Wno-missing-export-lists
     -Wno-missing-exported-signatures
     -Wno-missing-import-lists
+    -Wno-missing-safe-haskell-mode
+    -Wno-prepositive-qualified-module
     -Wno-unsafe
   hs-source-dirs: src/lib
-  other-modules:
-    Splint.GHC.Bag
-    Splint.GHC.Error
-    Splint.GHC.Plugins
-    Splint.Parser
 
   if impl(ghc >= 9.0)
-    hs-source-dirs: src/ghc-9.0
+    build-depends: hlint >= 3.3 && < 3.4
   else
-    if impl(ghc >= 8.10)
-      hs-source-dirs: src/ghc-8.10
-    else
-      hs-source-dirs: src/ghc-8.8
-
-  if impl(ghc >= 8.10)
-    ghc-options:
-      -Wno-missing-safe-haskell-mode
-      -Wno-prepositive-qualified-module
+    build-depends: hlint >= 3.2 && < 3.3
diff --git a/src/ghc-8.10/Splint/GHC/Bag.hs b/src/ghc-8.10/Splint/GHC/Bag.hs
deleted file mode 100644
--- a/src/ghc-8.10/Splint/GHC/Bag.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-module Splint.GHC.Bag ( module Export ) where
-
-import Bag as Export
diff --git a/src/ghc-8.10/Splint/GHC/Error.hs b/src/ghc-8.10/Splint/GHC/Error.hs
deleted file mode 100644
--- a/src/ghc-8.10/Splint/GHC/Error.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-module Splint.GHC.Error ( module Export ) where
-
-import ErrUtils as Export
diff --git a/src/ghc-8.10/Splint/GHC/Plugins.hs b/src/ghc-8.10/Splint/GHC/Plugins.hs
deleted file mode 100644
--- a/src/ghc-8.10/Splint/GHC/Plugins.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-module Splint.GHC.Plugins ( module Export ) where
-
-import GhcPlugins as Export
diff --git a/src/ghc-8.10/Splint/Parser.hs b/src/ghc-8.10/Splint/Parser.hs
deleted file mode 100644
--- a/src/ghc-8.10/Splint/Parser.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-module Splint.Parser where
-
-import qualified Language.Haskell.HLint as HLint
-import qualified Splint.GHC.Plugins as GHC
-
-parse
-  :: HLint.ParseFlags
-  -> GHC.ModSummary
-  -> GHC.HsParsedModule
-  -> GHC.Hsc HLint.ModuleEx
-parse _ _ hsParsedModule = do
-  let
-    apiAnns = GHC.hpm_annotations hsParsedModule
-    hsModule = GHC.hpm_module hsParsedModule
-  pure $ HLint.createModuleEx apiAnns hsModule
diff --git a/src/ghc-8.8/Splint/GHC/Bag.hs b/src/ghc-8.8/Splint/GHC/Bag.hs
deleted file mode 100644
--- a/src/ghc-8.8/Splint/GHC/Bag.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-module Splint.GHC.Bag ( module Export ) where
-
-import Bag as Export
diff --git a/src/ghc-8.8/Splint/GHC/Error.hs b/src/ghc-8.8/Splint/GHC/Error.hs
deleted file mode 100644
--- a/src/ghc-8.8/Splint/GHC/Error.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-module Splint.GHC.Error ( module Export ) where
-
-import ErrUtils as Export
diff --git a/src/ghc-8.8/Splint/GHC/Plugins.hs b/src/ghc-8.8/Splint/GHC/Plugins.hs
deleted file mode 100644
--- a/src/ghc-8.8/Splint/GHC/Plugins.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-module Splint.GHC.Plugins ( module Export ) where
-
-import GhcPlugins as Export
diff --git a/src/ghc-8.8/Splint/Parser.hs b/src/ghc-8.8/Splint/Parser.hs
deleted file mode 100644
--- a/src/ghc-8.8/Splint/Parser.hs
+++ /dev/null
@@ -1,32 +0,0 @@
-module Splint.Parser where
-
-import qualified Control.Exception as Exception
-import qualified Language.Haskell.HLint as HLint
-import qualified Splint.GHC.Plugins as GHC
-
-parse
-  :: HLint.ParseFlags
-  -> GHC.ModSummary
-  -> GHC.HsParsedModule
-  -> GHC.Hsc HLint.ModuleEx
-parse parseFlags modSummary _ = GHC.liftIO $ do
-  let filePath = GHC.msHsFilePath modSummary
-  result <- HLint.parseModuleEx parseFlags filePath Nothing
-  case result of
-    Left parseError -> Exception.throwIO $ ParseError parseError
-    Right moduleEx -> pure moduleEx
-
-newtype ParseError = ParseError HLint.ParseError
-
-instance Exception.Exception ParseError
-
-instance Show ParseError where
-  show (ParseError parseError) = mconcat
-    [ "ParseError { parseErrorLocation = "
-    , show $ HLint.parseErrorLocation parseError
-    , ", parseErrorMessage = "
-    , show $ HLint.parseErrorMessage parseError
-    , ", parseErrorContents = "
-    , show $ HLint.parseErrorContents parseError
-    , " }"
-    ]
diff --git a/src/ghc-9.0/Splint/GHC/Bag.hs b/src/ghc-9.0/Splint/GHC/Bag.hs
deleted file mode 100644
--- a/src/ghc-9.0/Splint/GHC/Bag.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-module Splint.GHC.Bag ( module Export ) where
-
-import GHC.Data.Bag as Export
diff --git a/src/ghc-9.0/Splint/GHC/Error.hs b/src/ghc-9.0/Splint/GHC/Error.hs
deleted file mode 100644
--- a/src/ghc-9.0/Splint/GHC/Error.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-module Splint.GHC.Error ( module Export ) where
-
-import GHC.Utils.Error as Export
diff --git a/src/ghc-9.0/Splint/GHC/Plugins.hs b/src/ghc-9.0/Splint/GHC/Plugins.hs
deleted file mode 100644
--- a/src/ghc-9.0/Splint/GHC/Plugins.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-module Splint.GHC.Plugins ( module Export ) where
-
-import GHC.Plugins as Export
diff --git a/src/ghc-9.0/Splint/Parser.hs b/src/ghc-9.0/Splint/Parser.hs
deleted file mode 100644
--- a/src/ghc-9.0/Splint/Parser.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-module Splint.Parser where
-
-import qualified Language.Haskell.HLint as HLint
-import qualified Splint.GHC.Plugins as GHC
-
-parse
-  :: HLint.ParseFlags
-  -> GHC.ModSummary
-  -> GHC.HsParsedModule
-  -> GHC.Hsc HLint.ModuleEx
-parse _ _ hsParsedModule = do
-  let
-    apiAnns = GHC.hpm_annotations hsParsedModule
-    hsModule = GHC.hpm_module hsParsedModule
-  pure $ HLint.createModuleEx apiAnns hsModule
diff --git a/src/lib/Splint.hs b/src/lib/Splint.hs
--- a/src/lib/Splint.hs
+++ b/src/lib/Splint.hs
@@ -1,20 +1,28 @@
+{-# LANGUAGE CPP #-}
+
 module Splint
   ( plugin
   )
 where
 
-import qualified Splint.GHC.Bag as GHC
 import qualified Control.Concurrent as Concurrent
 import qualified Control.Concurrent.STM as Stm
 import qualified Control.Exception as Exception
 import qualified Control.Monad.IO.Class as IO
 import qualified Data.Map as Map
-import qualified Splint.GHC.Error as GHC
-import qualified Splint.GHC.Plugins as GHC
 import qualified Language.Haskell.HLint as HLint
-import qualified Splint.Parser as Splint
 import qualified System.IO.Unsafe as Unsafe
 
+# if MIN_VERSION_GLASGOW_HASKELL(9, 0, 0, 0)
+import qualified GHC.Data.Bag as GHC
+import qualified GHC.Utils.Error as GHC
+import qualified GHC.Plugins as GHC
+# else
+import qualified Bag as GHC
+import qualified ErrUtils as GHC
+import qualified GhcPlugins as GHC
+# endif
+
 plugin :: GHC.Plugin
 plugin = GHC.defaultPlugin
   { GHC.parsedResultAction = action
@@ -28,7 +36,7 @@
   -> GHC.Hsc GHC.HsParsedModule
 action commandLineOptions modSummary hsParsedModule = do
   (parseFlags, classifies, hint) <- getSettings commandLineOptions
-  moduleEx <- Splint.parse parseFlags modSummary hsParsedModule
+  moduleEx <- parse parseFlags modSummary hsParsedModule
   dynFlags <- GHC.getDynFlags
   io
     . GHC.printOrThrowWarnings dynFlags
@@ -124,3 +132,14 @@
     _ -> GHC.empty
   , GHC.vcat . fmap (GHC.text . mappend "Note: " . show) $ HLint.ideaNote idea
   ]
+
+parse
+  :: HLint.ParseFlags
+  -> GHC.ModSummary
+  -> GHC.HsParsedModule
+  -> GHC.Hsc HLint.ModuleEx
+parse _ _ hsParsedModule = do
+  let
+    apiAnns = GHC.hpm_annotations hsParsedModule
+    hsModule = GHC.hpm_module hsParsedModule
+  pure $ HLint.createModuleEx apiAnns hsModule
