diff --git a/ghc-experimental.cabal b/ghc-experimental.cabal
--- a/ghc-experimental.cabal
+++ b/ghc-experimental.cabal
@@ -6,7 +6,7 @@
 name:               ghc-experimental
 -- The project is ghc's version plus ghc-experimental's version suffix.
 -- For example, for ghc=9.10.1, ghc-experimental's version will be 9.1001.0.
-version:            9.1003.0
+version:            9.1201.0
 synopsis:           Experimental features of GHC's standard library
 description:
     This package is where experimental GHC standard library interfaces start
@@ -29,17 +29,18 @@
 library
     import:           warnings
     exposed-modules:
+      Data.Sum.Experimental
+      Data.Tuple.Experimental
       GHC.PrimOps
       GHC.Profiling.Eras
-      Data.Tuple.Experimental
-      Data.Sum.Experimental
+      GHC.TypeLits.Experimental
+      GHC.TypeNats.Experimental
       Prelude.Experimental
     if arch(wasm32)
         exposed-modules:  GHC.Wasm.Prim
     other-extensions:
-    build-depends:    base ^>=4.20,
-                      ghc-internal == 9.1003.*,
-                      ghc-prim >= 0.11 && < 0.13
+    build-depends:    base >=4.20 && < 4.22,
+                      ghc-internal == 9.1201.*,
+                      ghc-prim >= 0.11 && < 0.14
     hs-source-dirs:   src
     default-language: Haskell2010
-    ghc-options: -this-unit-id ghc-experimental
diff --git a/src/Data/Tuple/Experimental.hs b/src/Data/Tuple/Experimental.hs
--- a/src/Data/Tuple/Experimental.hs
+++ b/src/Data/Tuple/Experimental.hs
@@ -21,7 +21,7 @@
 
   -- * Unboxed tuples
   Unit#,
-  Solo#,
+  Solo#(..),
   Tuple0#,
   Tuple1#,
   Tuple2#,
diff --git a/src/GHC/TypeLits/Experimental.hs b/src/GHC/TypeLits/Experimental.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/TypeLits/Experimental.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE NoStarIsType #-}
+{-# LANGUAGE TypeOperators #-}
+module GHC.TypeLits.Experimental (
+    appendSSymbol,
+    consSSymbol,
+    sCharToSNat,
+    sNatToSChar,
+) where
+
+import GHC.Internal.TypeLits
+import Data.Char (ord, chr)
+
+appendSSymbol :: SSymbol a -> SSymbol b -> SSymbol (AppendSymbol a b)
+appendSSymbol (UnsafeSSymbol a) (UnsafeSSymbol b) = UnsafeSSymbol (a ++ b)
+
+consSSymbol :: SChar a -> SSymbol b -> SSymbol (ConsSymbol a b)
+consSSymbol (UnsafeSChar a) (UnsafeSSymbol b) = UnsafeSSymbol (a : b)
+
+sCharToSNat :: SChar a -> SNat (CharToNat a)
+sCharToSNat (UnsafeSChar a) = UnsafeSNat (fromIntegral (ord a))
+
+sNatToSChar :: (n <= 1114111) => SNat n -> SChar (NatToChar n)
+sNatToSChar (UnsafeSNat n) = UnsafeSChar (chr (fromIntegral n))
diff --git a/src/GHC/TypeNats/Experimental.hs b/src/GHC/TypeNats/Experimental.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/TypeNats/Experimental.hs
@@ -0,0 +1,36 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE NoStarIsType #-}
+{-# LANGUAGE TypeOperators #-}
+module GHC.TypeNats.Experimental (
+    plusSNat,
+    timesSNat,
+    powerSNat,
+    minusSNat,
+    divSNat,
+    modSNat,
+    log2SNat,
+) where
+
+import GHC.Internal.TypeNats
+import GHC.Num.Natural (naturalLog2)
+
+plusSNat :: SNat n -> SNat m -> SNat (n + m)
+plusSNat (UnsafeSNat n) (UnsafeSNat m) = UnsafeSNat (n + m)
+
+timesSNat :: SNat n -> SNat m -> SNat (n * m)
+timesSNat (UnsafeSNat n) (UnsafeSNat m) = UnsafeSNat (n * m)
+
+powerSNat :: SNat n -> SNat m -> SNat (n ^ m)
+powerSNat (UnsafeSNat n) (UnsafeSNat m) = UnsafeSNat (n ^ m)
+
+minusSNat :: (m <= n) => SNat n -> SNat m -> SNat (n - m)
+minusSNat (UnsafeSNat n) (UnsafeSNat m) = UnsafeSNat (n - m)
+
+divSNat :: (1 <= m) => SNat n -> SNat m -> SNat (Div n m)
+divSNat (UnsafeSNat n) (UnsafeSNat m) = UnsafeSNat (div n m)
+
+modSNat :: (1 <= m) => SNat n -> SNat m -> SNat (Mod n m)
+modSNat (UnsafeSNat n) (UnsafeSNat m) = UnsafeSNat (mod n m)
+
+log2SNat :: (1 <= n) => SNat n -> SNat (Log2 n)
+log2SNat (UnsafeSNat n) = UnsafeSNat (fromIntegral (naturalLog2 n))
