diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+# effectful-plugin-1.1.0.3 (2024-06-07)
+* Drop support for GHC 8.8.
+
 # effectful-plugin-1.1.0.2 (2023-09-13)
 * Add support for GHC 9.8.
 
diff --git a/effectful-plugin.cabal b/effectful-plugin.cabal
--- a/effectful-plugin.cabal
+++ b/effectful-plugin.cabal
@@ -1,7 +1,7 @@
-cabal-version:      2.4
+cabal-version:      3.0
 build-type:         Simple
 name:               effectful-plugin
-version:            1.1.0.2
+version:            1.1.0.3
 license:            BSD-3-Clause
 license-file:       LICENSE
 category:           Control
@@ -17,8 +17,7 @@
 extra-source-files: CHANGELOG.md
                     README.md
 
-tested-with: GHC ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.8 || ==9.4.7 || ==9.6.2
-              || ==9.8.1
+tested-with: GHC == { 8.10.7, 9.0.2, 9.2.8, 9.4.8, 9.6.5, 9.8.2, 9.10.1 }
 
 bug-reports:   https://github.com/haskell-effectful/effectful/issues
 source-repository head
@@ -27,6 +26,7 @@
 
 common language
     ghc-options:        -Wall -Wcompat -Wno-unticked-promoted-constructors
+                        -Werror=prepositive-qualified-module
 
     default-language:   Haskell2010
 
@@ -39,6 +39,7 @@
                         FlexibleInstances
                         GADTs
                         GeneralizedNewtypeDeriving
+                        ImportQualifiedPost
                         LambdaCase
                         MultiParamTypeClasses
                         NoStarIsType
@@ -55,10 +56,10 @@
 library
     import:         language
 
-    build-depends:    base                >= 4.13      && < 5
+    build-depends:    base                >= 4.14      && < 5
                     , effectful-core      >= 1.0.0.0   && < 3.0.0.0
                     , containers          >= 0.5
-                    , ghc                 >= 8.8       && < 9.9
+                    , ghc                 >= 8.10      && < 9.11
 
     if impl(ghc < 9.4)
       build-depends:  ghc-tcplugins-extra >= 0.3       && < 0.5
diff --git a/src-legacy/Effectful/Plugin.hs b/src-legacy/Effectful/Plugin.hs
--- a/src-legacy/Effectful/Plugin.hs
+++ b/src-legacy/Effectful/Plugin.hs
@@ -2,46 +2,56 @@
 {-# LANGUAGE CPP #-}
 module Effectful.Plugin (plugin) where
 
-import           Data.Function           (on)
-import           Data.IORef              (IORef, modifyIORef, newIORef, readIORef)
-import           Data.Maybe              (isNothing, mapMaybe)
-import           Data.Set                (Set)
-import qualified Data.Set                as Set
-import           Data.Traversable        (for)
-import           GHC.TcPluginM.Extra     (lookupModule, lookupName)
+import Data.Function (on)
+import Data.IORef (IORef, modifyIORef, newIORef, readIORef)
+import Data.Maybe (isNothing, mapMaybe)
+import Data.Set (Set)
+import Data.Set qualified as Set
+import Data.Traversable (for)
+import GHC.TcPluginM.Extra (lookupModule, lookupName)
 
 #if __GLASGOW_HASKELL__ >= 900
-import           GHC.Core.Class          (Class)
-import           GHC.Core.InstEnv        (InstEnvs, lookupInstEnv)
-import           GHC.Core.Unify          (tcUnifyTy)
-import           GHC.Plugins             (Outputable (ppr), Plugin (pluginRecompile, tcPlugin), PredType,
-                                          Role (Nominal), TCvSubst, Type, defaultPlugin, eqType, fsLit, mkModuleName,
-                                          mkTcOcc, nonDetCmpType, purePlugin, showSDocUnsafe, splitAppTys, substTys,
-                                          tyConClass_maybe)
-import           GHC.Tc.Plugin           (tcLookupClass, tcPluginIO)
-import           GHC.Tc.Solver.Monad     (newWantedEq, runTcSDeriveds)
-import           GHC.Tc.Types            (TcM, TcPlugin (TcPlugin, tcPluginInit, tcPluginSolve, tcPluginStop),
-                                          TcPluginM, TcPluginResult (TcPluginOk), unsafeTcPluginTcM)
-import           GHC.Tc.Types.Constraint (Ct (CDictCan, CNonCanonical), CtEvidence (CtWanted), CtLoc, ctPred)
-import           GHC.Tc.Utils.Env        (tcGetInstEnvs)
-import           GHC.Tc.Utils.TcType     (tcSplitTyConApp)
+import GHC.Core.Class (Class)
+import GHC.Core.InstEnv (InstEnvs, lookupInstEnv)
+import GHC.Core.Unify (tcUnifyTy)
+import GHC.Plugins
+  ( Outputable (ppr), Plugin (pluginRecompile, tcPlugin), PredType
+  , Role (Nominal), TCvSubst, Type, defaultPlugin, eqType, fsLit, mkModuleName
+  , mkTcOcc, nonDetCmpType, purePlugin, showSDocUnsafe, splitAppTys, substTys
+  , tyConClass_maybe
+  )
+import GHC.Tc.Plugin (tcLookupClass, tcPluginIO)
+import GHC.Tc.Solver.Monad (newWantedEq, runTcSDeriveds)
+import GHC.Tc.Types
+  ( TcM, TcPlugin (TcPlugin, tcPluginInit, tcPluginSolve, tcPluginStop)
+  , TcPluginM, TcPluginResult (TcPluginOk), unsafeTcPluginTcM
+  )
+import GHC.Tc.Types.Constraint
+  (Ct (CDictCan, CNonCanonical), CtEvidence (CtWanted), CtLoc, ctPred
+  )
+import GHC.Tc.Utils.Env (tcGetInstEnvs)
+import GHC.Tc.Utils.TcType (tcSplitTyConApp)
 
 #else
-import           Class                   (Class)
+import Class (Class)
 #if __GLASGOW_HASKELL__ >= 810
-import           Constraint              (Ct (CDictCan, CNonCanonical), CtEvidence (CtWanted), CtLoc, ctPred)
+import Constraint
+  (Ct (CDictCan, CNonCanonical), CtEvidence (CtWanted), CtLoc, ctPred
+  )
 #endif
-import           GhcPlugins              (Outputable (ppr), Plugin (pluginRecompile, tcPlugin), PredType,
-                                          Role (Nominal), TCvSubst, Type, defaultPlugin, eqType, fsLit, mkModuleName,
-                                          mkTcOcc, nonDetCmpType, purePlugin, showSDocUnsafe, splitAppTys, substTys,
-                                          tyConClass_maybe)
-import           InstEnv                 (InstEnvs, lookupInstEnv)
-import           TcEnv                   (tcGetInstEnvs)
-import           TcPluginM               (tcLookupClass, tcPluginIO)
-import           TcRnTypes
-import           TcSMonad                (newWantedEq, runTcSDeriveds)
-import           TcType                  (tcSplitTyConApp)
-import           Unify                   (tcUnifyTy)
+import GhcPlugins
+  ( Outputable (ppr), Plugin (pluginRecompile, tcPlugin), PredType
+  , Role (Nominal), TCvSubst, Type, defaultPlugin, eqType, fsLit, mkModuleName
+  , mkTcOcc, nonDetCmpType, purePlugin, showSDocUnsafe, splitAppTys, substTys
+  , tyConClass_maybe
+  )
+import InstEnv (InstEnvs, lookupInstEnv)
+import TcEnv (tcGetInstEnvs)
+import TcPluginM (tcLookupClass, tcPluginIO)
+import TcRnTypes
+import TcSMonad (newWantedEq, runTcSDeriveds)
+import TcType (tcSplitTyConApp)
+import Unify (tcUnifyTy)
 #endif
 
 plugin :: Plugin
diff --git a/src/Effectful/Plugin.hs b/src/Effectful/Plugin.hs
--- a/src/Effectful/Plugin.hs
+++ b/src/Effectful/Plugin.hs
@@ -6,8 +6,8 @@
 import Data.IORef
 import Data.Maybe
 import Data.Set (Set)
+import Data.Set qualified as Set
 import Data.Traversable
-import qualified Data.Set as Set
 
 import GHC.Core.Class (Class)
 import GHC.Core.InstEnv (InstEnvs, lookupInstEnv)
