diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
 # Revision history for deriving-trans
 
+## 0.10.0.0 *02 Apr 2026*
+
+* Add support for `GHC 9.12`.
+* Add explicit role annotations
+* Disable the `random` flag by default.
+* Drop support for the random version `>= 1.13`.
+
 ## 0.9.1.0 *12 Jul 2023*
 
 * Support new optional dependency monad-logger `>= 0.3.38`.
diff --git a/deriving-trans.cabal b/deriving-trans.cabal
--- a/deriving-trans.cabal
+++ b/deriving-trans.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name: deriving-trans
-version: 0.9.1.0
+version: 0.10.0.0
 synopsis: Derive instances for monad transformer stacks
 description:
   Implementing instances for monad transformer stacks can be tedious.
@@ -51,7 +51,7 @@
     Implement instances for `PrimMonad`.
 
 flag random
-  default: True
+  default: False
   description:
     Implement instances for random's type classes.
 
@@ -98,7 +98,7 @@
       , primitive >= 0.7.1.0
   if flag(random)
     build-depends:
-      , random >= 1.2
+      , random >= 1.2 && < 1.3
   if flag(resourcet)
     build-depends:
       , resourcet >= 1.2
@@ -115,6 +115,7 @@
     OverloadedStrings
     TypeFamilies
     UnboxedTuples
+    RoleAnnotations
   ghc-options:
     -Weverything
     -Wno-all-missed-specialisations
diff --git a/src/Control/Monad/Trans/Compose.hs b/src/Control/Monad/Trans/Compose.hs
--- a/src/Control/Monad/Trans/Compose.hs
+++ b/src/Control/Monad/Trans/Compose.hs
@@ -102,6 +102,7 @@
               -> (Type -> Type) -- @m@
               -> Type -- @a@
               -> Type
+type role ComposeT representational nominal nominal nominal
 newtype ComposeT t1 t2 m a = ComposeT { deComposeT :: t1 (t2 m) a }
   deriving newtype (Applicative, Functor, Monad)
 
diff --git a/src/Control/Monad/Trans/Compose/Stack.hs b/src/Control/Monad/Trans/Compose/Stack.hs
--- a/src/Control/Monad/Trans/Compose/Stack.hs
+++ b/src/Control/Monad/Trans/Compose/Stack.hs
@@ -53,6 +53,7 @@
 -- This is basically a heterogeneous list of monad transformer runners.
 --
 -- 'RunStackT' can only be used for monad transformer stacks without monadic state t'Control.Monad.Trans.Control.StT'.
+type role RunStackT nominal nominal nominal
 data RunStackT :: Stack -> (Type -> Type) -> Type -> Type where
   -- | run an empty monad transformer stack
   RunNilT :: RunStackT NilT m a
diff --git a/src/Control/Monad/Trans/Compose/Transparent.hs b/src/Control/Monad/Trans/Compose/Transparent.hs
--- a/src/Control/Monad/Trans/Compose/Transparent.hs
+++ b/src/Control/Monad/Trans/Compose/Transparent.hs
@@ -7,6 +7,7 @@
 import Control.Monad.Trans.Control.Identity
 import Control.Monad.Trans.Elevator
 import Control.Monad.Trans.Identity
+import Data.Kind
 
 -- | A monad transformer, that passes through all instances via 'Elevator'.
 --
@@ -20,6 +21,8 @@
 -- | A newtype wrapper around 'IdentityT'.
 --
 -- This is used in 'TransparentT' to encourage the use of 'runTransparentT'.
+type NoT :: (Type -> Type) -> Type -> Type
+type role NoT representational nominal
 newtype NoT m a = MkNoT {unNoT :: IdentityT m a}
   deriving newtype (Functor, Applicative, Monad)
   deriving newtype (MonadTrans, MonadTransControl, MonadTransControlIdentity)
diff --git a/src/Control/Monad/Trans/Elevator.hs b/src/Control/Monad/Trans/Elevator.hs
--- a/src/Control/Monad/Trans/Elevator.hs
+++ b/src/Control/Monad/Trans/Elevator.hs
@@ -78,6 +78,7 @@
               -> (Type -> Type) -- @m@
               -> Type -- @a@
               -> Type
+type role Elevator representational nominal nominal
 newtype Elevator t m a = Ascend { descend :: t m a }
   deriving newtype (Applicative, Functor, Monad)
   deriving newtype (MonadTrans, MonadTransControl, MonadTransControlIdentity)
