diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for recover-rtti
 
+## 0.5.3 -- 2026-01-07
+
+* Support `ghc-9.14` (Brandon Chinn, #48)
+* Support `containers-0.8` (Brandon Chinn, #49)
+
 ## 0.5.2 -- 2025-12-16
 
 * Support `unordered-containers-0.2.21` (Brandon Chinn, #45)
diff --git a/recover-rtti.cabal b/recover-rtti.cabal
--- a/recover-rtti.cabal
+++ b/recover-rtti.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               recover-rtti
-version:            0.5.2
+version:            0.5.3
 synopsis:           Recover run-time type information from the GHC heap
 description:        The main function in this package is 'classify', which looks
                     at the GHC heap to recover type information about arbitrary
@@ -24,13 +24,14 @@
                     GHC==9.8.4
                     GHC==9.10.2
                     GHC==9.12.2
+                    GHC==9.14.1
 
 source-repository head
   type:     git
   location: https://github.com/well-typed/recover-rtti
 
 common lang
-  build-depends:    base >= 4.16 && < 4.22
+  build-depends:    base >= 4.16 && < 4.23
   default-language: GHC2021
 
   ghc-options:
@@ -79,8 +80,8 @@
   build-depends:
       -- bundled libraries
     , bytestring >= 0.11 && < 0.13
-    , containers >= 0.6  && < 0.8
-    , ghc-heap   >= 9.2  && < 9.13
+    , containers >= 0.6  && < 0.9
+    , ghc-heap   >= 9.2  && < 9.15
     , mtl        >= 2.2  && < 2.4
     , stm        >= 2.5  && < 2.6
     , text       >= 1.2  && < 2.2
diff --git a/src/Debug/RecoverRTTI/Modules.hs b/src/Debug/RecoverRTTI/Modules.hs
--- a/src/Debug/RecoverRTTI/Modules.hs
+++ b/src/Debug/RecoverRTTI/Modules.hs
@@ -21,18 +21,22 @@
 -------------------------------------------------------------------------------}
 
 data KnownPkg =
-    PkgGhcPrim
+    PkgBase
+#if !MIN_VERSION_base(4,22,0)
+  | PkgGhcPrim
+#endif
 #if MIN_VERSION_base(4,20,0)
   | PkgGhcInternal
 #endif
-  | PkgBase
 #if !MIN_VERSION_base(4,17,0)
   | PkgDataArrayByte
 #endif
   | PkgByteString
   | PkgText
   | PkgIntegerWiredIn
+#if !MIN_VERSION_base(4,22,0)
   | PkgGhcBignum
+#endif
   | PkgContainers
   | PkgAeson
   | PkgUnorderedContainers
@@ -46,7 +50,9 @@
 -------------------------------------------------------------------------------}
 
 data SPkg (pkg :: KnownPkg) where
+#if !MIN_VERSION_base(4,22,0)
   SGhcPrim             :: SPkg 'PkgGhcPrim
+#endif
 #if MIN_VERSION_base(4,20,0)
   SGhcInternal         :: SPkg 'PkgGhcInternal
 #endif
@@ -57,7 +63,9 @@
   SByteString          :: SPkg 'PkgByteString
   SText                :: SPkg 'PkgText
   SIntegerWiredIn      :: SPkg 'PkgIntegerWiredIn
+#if !MIN_VERSION_base(4,22,0)
   SGhcBignum           :: SPkg 'PkgGhcBignum
+#endif
   SContainers          :: SPkg 'PkgContainers
   SAeson               :: SPkg 'PkgAeson
   SUnorderedContainers :: SPkg 'PkgUnorderedContainers
@@ -67,7 +75,9 @@
 class IsKnownPkg pkg where
   singPkg :: SPkg pkg
 
+#if !MIN_VERSION_base(4,22,0)
 instance IsKnownPkg 'PkgGhcPrim             where singPkg = SGhcPrim
+#endif
 #if MIN_VERSION_base(4,20,0)
 instance IsKnownPkg 'PkgGhcInternal         where singPkg = SGhcInternal
 #endif
@@ -78,7 +88,9 @@
 instance IsKnownPkg 'PkgByteString          where singPkg = SByteString
 instance IsKnownPkg 'PkgText                where singPkg = SText
 instance IsKnownPkg 'PkgIntegerWiredIn      where singPkg = SIntegerWiredIn
+#if !MIN_VERSION_base(4,22,0)
 instance IsKnownPkg 'PkgGhcBignum           where singPkg = SGhcBignum
+#endif
 instance IsKnownPkg 'PkgContainers          where singPkg = SContainers
 instance IsKnownPkg 'PkgAeson               where singPkg = SAeson
 instance IsKnownPkg 'PkgUnorderedContainers where singPkg = SUnorderedContainers
@@ -89,9 +101,11 @@
   Modules in @ghc-prim@
 -------------------------------------------------------------------------------}
 
+#if !MIN_VERSION_base(4,22,0)
 data instance KnownModule 'PkgGhcPrim =
     GhcTypes
   | GhcTuple
+#endif
 
 {-------------------------------------------------------------------------------
   Modules in @ghc-internal@ (ghc 9.10 and up)
@@ -108,6 +122,11 @@
   | GhcReal
   | DataEither
 #endif
+#if MIN_VERSION_base(4,22,0)
+  | GhcTypes -- Moved from ghc-prim
+  | GhcTuple -- Moved from ghc-prim
+  | GhcNumInteger -- Moved from ghc-internal
+#endif
 
 {-------------------------------------------------------------------------------
   Modules in @base@
@@ -168,8 +187,10 @@
   Modules in @ghc-bignum@
 -------------------------------------------------------------------------------}
 
+#if !MIN_VERSION_base(4,22,0)
 data instance KnownModule 'PkgGhcBignum =
     GhcNumInteger
+#endif
 
 {-------------------------------------------------------------------------------
   Modules in @containers@
@@ -244,7 +265,9 @@
     go _ _ _otherClosure = Nothing
 
     namePkg :: SPkg pkg -> String
+#if !MIN_VERSION_base(4,22,0)
     namePkg SGhcPrim             = "ghc-prim"
+#endif
 #if MIN_VERSION_base(4,20,0)
     namePkg SGhcInternal         = "ghc-internal"
 #endif
@@ -255,7 +278,9 @@
     namePkg SByteString          = "bytestring"
     namePkg SText                = "text"
     namePkg SIntegerWiredIn      = "integer-wired-in"
+#if !MIN_VERSION_base(4,22,0)
     namePkg SGhcBignum           = "ghc-bignum"
+#endif
     namePkg SContainers          = "containers"
     namePkg SAeson               = "aeson"
     namePkg SUnorderedContainers = "unordered-containers"
@@ -264,9 +289,8 @@
 
     nameModl :: SPkg pkg -> KnownModule pkg -> String
     nameModl = \case
+#if !MIN_VERSION_base(4,22,0)
         SGhcPrim -> \case
-          GhcTypes -> "GHC.Types"
-
     -- ghc-prim versions bundled with ghc:
     --
     -- >         base   ghc-prim
@@ -277,12 +301,15 @@
     -- > 9.8.4   4.19   0.11.0
     -- > 9.10.2  4.20   0.12.0
     -- > 9.12.2  4.21   0.13.0
+    -- > 9.14.1  4.22   0.13.1
     --
     -- If we want to use @MIN_VERSION_ghc_prim@, we need to declare a dependency
     -- on @ghc-prim@; since, we don't /actually/ depend on it, however, other
     -- than to check the version, this results in unused package warnings.
     -- We therefore use the version of base as a proxy.
 
+          GhcTypes -> "GHC.Types"
+
 #if MIN_VERSION_base(4,20,0)
           GhcTuple -> "GHC.Tuple"
 #elif MIN_VERSION_base(4,18,0)
@@ -291,6 +318,7 @@
 #else
           GhcTuple -> "GHC.Tuple"
 #endif
+#endif
 
 #if MIN_VERSION_base(4,20,0)
         SGhcInternal -> \case
@@ -303,6 +331,11 @@
           GhcReal     -> "GHC.Internal.Real"
           DataEither  -> "GHC.Internal.Data.Either"
 #endif
+#if MIN_VERSION_base(4,22,0)
+          GhcTypes    -> "GHC.Internal.Types"
+          GhcTuple    -> "GHC.Internal.Tuple"
+          GhcNumInteger -> "GHC.Internal.Bignum.Integer"
+#endif
 
         SBase -> \case
 #if !MIN_VERSION_base(4,20,0)
@@ -334,8 +367,10 @@
         SIntegerWiredIn -> \case
           GhcIntegerType -> "GHC.Integer.Type"
 
+#if !MIN_VERSION_base(4,22,0)
         SGhcBignum -> \case
           GhcNumInteger -> "GHC.Num.Integer"
+#endif
 
         SContainers -> \case
           DataSetInternal      -> "Data.Set.Internal"
