diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,12 @@
 # Revision history for data-elevator
 
+## ?.? -- ????-??-??
+
+* Added support for GHC versions 9.12 and 9.14
+
 ## 0.2 -- 2024-09-16
+
+No changes to the API, but a significant change to the conversion functions.
 
 * Fix issue #4, which makes `toStrict#` and `fromLazy#` NOINLINE.
   We now have rewrite rules to cancel away, e.g., `fromStrict# . toStrict# = id`.
diff --git a/data-elevator.cabal b/data-elevator.cabal
--- a/data-elevator.cabal
+++ b/data-elevator.cabal
@@ -1,8 +1,8 @@
 cabal-version:      2.4
 name:               data-elevator
-version:            0.2
+version:            0.3
 
-tested-with: GHC ==9.2.8 || ==9.4.8 || ==9.6.6 || ==9.8.2 || ==9.10.1
+tested-with: GHC ==9.2.8 || ==9.4.8 || ==9.6.6 || ==9.8.2 || ==9.10.1 || ==9.12.1 || ==9.14.1
 
 -- A short (one-line) description of the package.
 synopsis: Coerce between unlifted boxed and lifted types.
@@ -42,7 +42,7 @@
 
     -- LANGUAGE extensions used by modules in this package.
     -- other-extensions:
-    build-depends:    base >=4.16 && <4.21
+    build-depends:    base >=4.16 && <4.23
     hs-source-dirs:   src
     default-language: Haskell2010
 
@@ -55,7 +55,7 @@
     main-is:          Main.hs
     hs-source-dirs:   test
     other-modules:    Issue4
-    build-depends:    base >=4.16 && <4.21
+    build-depends:    base >=4.16 && <4.23
                     , data-elevator
                     , primitive
                     , hspec
diff --git a/src/Data/Elevator/Internal.hs b/src/Data/Elevator/Internal.hs
--- a/src/Data/Elevator/Internal.hs
+++ b/src/Data/Elevator/Internal.hs
@@ -1,7 +1,6 @@
-{-# LANGUAGE BangPatterns          #-}
+{-# LANGUAGE CPP                   #-}
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE PolyKinds             #-}
-{-# LANGUAGE KindSignatures        #-}
 {-# LANGUAGE TypeApplications      #-}
 {-# LANGUAGE RoleAnnotations       #-}
 {-# LANGUAGE MagicHash             #-}
@@ -11,9 +10,7 @@
 {-# LANGUAGE UnliftedNewtypes      #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE FlexibleInstances     #-}
-{-# LANGUAGE ExplicitForAll        #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
-{-# LANGUAGE InstanceSigs          #-}
 
 -- | This module doesn't respect the PVP!
 -- Breaking changes may happen at any minor version (^>= *.*.m.*)
@@ -50,8 +47,13 @@
 toStrict# :: a -> Strict a
 toStrict# = unsafeCoerce id
 {-# NOINLINE toStrict# #-} -- See Note [NOINLINE toStrict#/fromLazy#]
+
+-- Before 9.6, the let/app invariant is still in effect and the rewrite rules
+-- error
+#if __GLASGOW_HASKELL__ >= 906
 {-# RULES "fromStrict#.toStrict#" forall x. fromStrict# (toStrict# x) = x #-}
 {-# RULES "toLazy#.toStrict#" forall x. toLazy# (toStrict# x) = unsafeCoerce id x #-}
+#endif
 
 fromStrict# :: Strict a -> a
 fromStrict# = unsafeCoerce id
@@ -84,8 +86,13 @@
 fromLazy# :: Lazy a -> a
 fromLazy# = unsafeCoerce id
 {-# NOINLINE fromLazy# #-} -- See Note [NOINLINE toStrict#/fromLazy#]
+
+-- Before 9.6, the let/app invariant is still in effect and the rewrite rules
+-- error
+#if __GLASGOW_HASKELL__ >= 906
 {-# RULES "toLazy#.fromLazy#" forall x. toLazy# (fromLazy# x) = x #-}
 {-# RULES "fromStrict#.fromLazy#" forall x. fromStrict# (fromLazy# x) = unsafeCoerce id x #-}
+#endif
 
 pattern Lazy :: a -> Lazy a
 pattern Lazy x <- (fromLazy# -> x) where
diff --git a/test/Issue4.hs b/test/Issue4.hs
--- a/test/Issue4.hs
+++ b/test/Issue4.hs
@@ -1,14 +1,10 @@
 {-# OPTIONS_GHC -O2              #-}
+{-# LANGUAGE CPP                 #-}
 {-# LANGUAGE MagicHash           #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeApplications    #-}
 {-# LANGUAGE UnboxedTuples       #-}
-module Issue4 (
-    StrictArray,
-    primArrayToStrictArray,
-    indexStrictArray,
-    sizeofStrictArray,
-) where
+module Issue4 where
 
 import           Data.Elevator (Strict (Strict))
 import qualified Data.Primitive as P
@@ -16,6 +12,8 @@
 import           GHC.Exts ((+#))
 import           GHC.ST (ST(ST), runST)
 
+-- 9.2 does not allow lev poly GHC.Array#
+#if __GLASGOW_HASKELL__ >= 904
 data StrictArray a = StrictArray !(GHC.Array# (Strict a))
 
 primArrayToStrictArray :: forall a. P.Array a -> StrictArray a
@@ -57,3 +55,4 @@
 sizeofStrictArray :: StrictArray a -> Int
 sizeofStrictArray (StrictArray a#) =
     GHC.I# (GHC.sizeofArray# a#)
+#endif
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -1,5 +1,6 @@
 {-# OPTIONS_GHC -fplugin=Test.Inspection.Plugin #-}
 
+{-# LANGUAGE CPP              #-}
 {-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE MagicHash        #-}
 {-# LANGUAGE UnboxedTuples    #-}
@@ -50,12 +51,18 @@
       it "rank2 co: (Int -> Int) -> Int ~ (Strict Int -> Int) -> Int" $ do
         levCoerce @((Strict Int -> Int) -> Int) @((Int -> Strict Int) -> Int) (\f -> f (Strict 42)) (\x -> Strict x) `shouldBe` (42 :: Int)
 
+-- 9.2 does not allow lev poly GHC.Array#
+#if __GLASGOW_HASKELL__ >= 904
   describe "Issue 4" $ do
     it "should not crash" $ do
       let arr = P.createArray 5 (even (sum [0..1000]) :: Bool) (\_arr -> return ())
       let sarr = Issue4.primArrayToStrictArray arr
       Issue4.indexStrictArray sarr 3 `shouldBe` True
+#endif
 
+-- Before 9.6, the let/app invariant is still in effect and the rewrite rules
+-- error
+#if __GLASGOW_HASKELL__ >= 906
 from_to_strict :: Bool -> Bool
 from_to_strict x = fromStrict# (toStrict# x)
 
@@ -72,3 +79,4 @@
 inspect $ ('from_to_strict2 `doesNotUse` 'toStrict#) { expectFail = True } -- https://gitlab.haskell.org/ghc/ghc/-/issues/25261
 inspect $ 'to_from_lazy `doesNotUse` 'fromLazy#
 inspect $ ('to_from_lazy2 `doesNotUse` 'fromLazy#) { expectFail = True } -- https://gitlab.haskell.org/ghc/ghc/-/issues/25261
+#endif
