diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,14 @@
+0.5.1.1
+---
+
+Compatibility with GHC 9.8
+
+0.5.1
+---
+
+Compatibility with GHC 9.4 and 9.6
+
+
 0.5.0.1
 ---
 
diff --git a/Rattus.cabal b/Rattus.cabal
--- a/Rattus.cabal
+++ b/Rattus.cabal
@@ -1,6 +1,6 @@
 cabal-version:       1.18
 name:                Rattus
-version:             0.5.1
+version:             0.5.1.1
 category:            FRP
 synopsis:            A modal FRP language
 description:
@@ -155,7 +155,11 @@
                        Rattus.Plugin.Utils
                        Rattus.Plugin.Dependency
                        Rattus.Plugin.StableSolver
-  build-depends:       base >=4.12 && <5, containers, ghc >= 8.6 && < 9.7, ghc-prim, simple-affine-space, transformers
+  build-depends:       base >=4.12 && <5,
+                       containers >= 0.5 && < 0.8,
+                       ghc >= 8.6 && < 9.9,
+                       simple-affine-space >= 0.2.1 && < 0.3,
+                       transformers >= 0.5 && < 0.7
   hs-source-dirs:      src
   default-language:    Haskell2010
   ghc-options:         -W
diff --git a/src/Rattus/Plugin/Dependency.hs b/src/Rattus/Plugin/Dependency.hs
--- a/src/Rattus/Plugin/Dependency.hs
+++ b/src/Rattus/Plugin/Dependency.hs
@@ -382,8 +382,18 @@
   getFV (HsCmdWrap _ _ cmd) = getFV cmd
 #endif
   getFV (XCmd e) = getFV e
-  
 
+instance (HasFV a, HasFV b) => HasFV (Either a b) where
+  getFV (Left x) = getFV x
+  getFV (Right x) = getFV x
+
+#if __GLASGOW_HASKELL__ >= 908
+instance HasFV (LHsRecUpdFields GhcTc) where
+  getFV RegularRecUpdFields {recUpdFields = x} = getFV x
+  getFV OverloadedRecUpdFields {olRecUpdFields = x} = getFV x
+#endif
+
+
 instance HasFV (HsCmdTop GhcTc) where
   getFV (HsCmdTop _ cmd) = getFV cmd
 #if __GLASGOW_HASKELL__ < 900
@@ -412,12 +422,10 @@
   getFV HsProjection {} = Set.empty
   getFV HsGetField {gf_expr = e} = getFV e
   getFV (ExplicitList _ es) = getFV es
-  getFV (RecordUpd {rupd_expr = e, rupd_flds = fs}) =
-    getFV e `Set.union` either getFV getFV fs
 #else
   getFV (ExplicitList _ _ es) = getFV es
-  getFV (RecordUpd {rupd_expr = e, rupd_flds = fs}) = getFV e `Set.union` getFV fs
 #endif
+  getFV (RecordUpd {rupd_expr = e, rupd_flds = fs}) = getFV e `Set.union` getFV fs
   getFV (RecordCon {rcon_flds = fs}) = getFV fs
   getFV (ArithSeq _ _ e) = getFV e
 #if __GLASGOW_HASKELL__ >= 906
diff --git a/src/Rattus/Plugin/ScopeCheck.hs b/src/Rattus/Plugin/ScopeCheck.hs
--- a/src/Rattus/Plugin/ScopeCheck.hs
+++ b/src/Rattus/Plugin/ScopeCheck.hs
@@ -564,13 +564,12 @@
   check (HsMultiIf _ e) = check e
 #if __GLASGOW_HASKELL__ >= 902
   check (ExplicitList _ e) = check e
-  check RecordUpd { rupd_expr = e, rupd_flds = fs} = (&&) <$> check e <*> either check check fs
   check HsProjection {} = return True
   check HsGetField {gf_expr = e} = check e
 #else
   check (ExplicitList _ _ e) = check e
-  check RecordUpd { rupd_expr = e, rupd_flds = fs} = (&&) <$> check e <*> check fs
 #endif
+  check RecordUpd { rupd_expr = e, rupd_flds = fs} = (&&) <$> check e <*> check fs
   check RecordCon { rcon_flds = f} = check f
   check (ArithSeq _ _ e) = check e
 #if __GLASGOW_HASKELL__ >= 906
@@ -616,6 +615,18 @@
 impossible :: GetCtxt => TcM Bool
 impossible = printMessageCheck SevError "This syntax should never occur after typechecking"
 #endif
+
+instance (Scope a, Scope b) => Scope (Either a b) where
+  check (Left x) = check x
+  check (Right x) = check x
+
+
+#if __GLASGOW_HASKELL__ >= 908
+instance Scope (LHsRecUpdFields GhcTc) where
+  check RegularRecUpdFields {recUpdFields = x} = check x
+  check OverloadedRecUpdFields {olRecUpdFields = x} = check x
+#endif
+
 
 #if __GLASGOW_HASKELL__ >= 900
 instance Scope XXExprGhcTc where
diff --git a/src/Rattus/Plugin/StableSolver.hs b/src/Rattus/Plugin/StableSolver.hs
--- a/src/Rattus/Plugin/StableSolver.hs
+++ b/src/Rattus/Plugin/StableSolver.hs
@@ -81,7 +81,12 @@
     Just evs -> return $ TcPluginOk evs []
     Nothing -> return $ TcPluginOk [] []
 
-  where filterCt ct@(CDictCan {cc_class = cl, cc_tyargs = [ty]})
+  where
+#if __GLASGOW_HASKELL__ >= 908
+        filterCt ct@(CDictCan (DictCt {di_cls = cl, di_tys = [ty]}))
+#else
+        filterCt ct@(CDictCan {cc_class = cl, cc_tyargs = [ty]})
+#endif
           = case getNameModule cl of
               Just (name,mod)
                 | isRattModule mod && name == "Stable" -> [(ty,(ct,cl))]
diff --git a/src/Rattus/Plugin/Utils.hs b/src/Rattus/Plugin/Utils.hs
--- a/src/Rattus/Plugin/Utils.hs
+++ b/src/Rattus/Plugin/Utils.hs
@@ -22,6 +22,12 @@
   getAlt,
   splitForAllTys')
   where
+
+
+#if __GLASGOW_HASKELL__ >= 908
+import GHC.Types.Error (ResolvedDiagnosticReason (..))
+#endif
+
 #if __GLASGOW_HASKELL__ >= 906
 import GHC.Builtin.Types.Prim
 import GHC.Tc.Utils.TcType
@@ -72,7 +78,12 @@
                 Severity -> SrcSpan -> MsgDoc -> m ()
 #endif
 printMessage sev loc doc = do
-#if __GLASGOW_HASKELL__ >= 906
+#if __GLASGOW_HASKELL__ >= 908
+  logger <- getLogger
+  liftIO $ putLogMsg logger (logFlags logger)
+    (MCDiagnostic sev (if sev == SevError then ResolvedDiagnosticReason ErrorWithoutFlag else ResolvedDiagnosticReason WarningWithoutFlag) Nothing) loc doc
+#elif __GLASGOW_HASKELL__ >= 906
+
   logger <- getLogger
   liftIO $ putLogMsg logger (logFlags logger)
     (MCDiagnostic sev (if sev == SevError then ErrorWithoutFlag else WarningWithoutFlag) Nothing) loc doc
