diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Version history for `ImpSpec`
 
+## 0.2.0.0
+
+* Add explicit `forall` for `uniformM`, `uniformRM`, `uniformListM`, `uniformListRM` and `arbitrary`
+
 ## 0.1.0.0
 
-*
+* Initital release
diff --git a/ImpSpec.cabal b/ImpSpec.cabal
--- a/ImpSpec.cabal
+++ b/ImpSpec.cabal
@@ -1,79 +1,93 @@
-cabal-version:      1.18
-name:               ImpSpec
-version:            0.1.0.0
-license:            Apache-2.0
-license-file:       LICENSE
-maintainer:         operations@iohk.io
-author:             IOHK
-homepage:           https://github.com/input-output-hk/ImpSpec
+cabal-version: 2.4
+name: ImpSpec
+version: 0.2.0.0
+license: Apache-2.0
+license-file: LICENSE
+maintainer: operations@iohk.io
+author: IOHK
+homepage: https://github.com/input-output-hk/ImpSpec
 synopsis:
-    Imperative approach to testing stateful applications. ImpSpec is build on top of HSpec and QuickCheck
+  Imperative approach to testing stateful applications.
+  ImpSpec is built on top of HSpec and QuickCheck.
+
 description:
-    Let a little imp help you discover all the bugs in your stateful Haskell program.
-category:           Control
-build-type:         Simple
-extra-doc-files:    CHANGELOG.md
+  Let a little imp help you discover all the bugs in your stateful Haskell program.
+
+category: Testing
+build-type: Simple
+extra-doc-files: CHANGELOG.md
 extra-source-files: README.md
-tested-with:        GHC == 8.2.2
-                  , GHC == 8.4.4
-                  , GHC == 8.6.5
-                  , GHC == 8.8.4
-                  , GHC == 8.10.7
-                  , GHC == 9.0.2
-                  , GHC == 9.2.8
-                  , GHC == 9.4.8
-                  , GHC == 9.6.6
-                  , GHC == 9.8.2
-                  , GHC == 9.10.1
+tested-with:
+  ghc ==8.2.2
+  ghc ==8.4.4
+  ghc ==8.6.5
+  ghc ==8.8.4
+  ghc ==8.10.7
+  ghc ==9.0.2
+  ghc ==9.2.8
+  ghc ==9.4.8
+  ghc ==9.6.6
+  ghc ==9.8.2
+  ghc ==9.10.3
 
 source-repository head
-    type:     git
-    location: https://github.com/intersectmbo/cardano-ledger
-    subdir:   libs/ImpSpec
+  type: git
+  location: https://github.com/input-output-hk/ImpSpec
 
 library
-    exposed-modules:
-        Test.ImpSpec
-        Test.ImpSpec.Expectations
-        Test.ImpSpec.Expectations.Lifted
-        Test.ImpSpec.Main
-        Test.ImpSpec.Random
+  exposed-modules:
+    Test.ImpSpec
+    Test.ImpSpec.Expectations
+    Test.ImpSpec.Expectations.Lifted
+    Test.ImpSpec.Main
+    Test.ImpSpec.Random
 
-    hs-source-dirs:   src
-    other-modules:    Test.ImpSpec.Internal
-    default-language: Haskell2010
-    ghc-options:
-        -Wall -Wcompat -Wincomplete-record-updates
-        -Wincomplete-uni-patterns -Wredundant-constraints
+  hs-source-dirs: src
+  other-modules: Test.ImpSpec.Internal
+  default-language: Haskell2010
+  ghc-options:
+    -Wall
+    -Wcompat
+    -Wincomplete-record-updates
+    -Wincomplete-uni-patterns
+    -Wredundant-constraints
 
-    build-depends:
-        base >=4.9 && <5,
-        bytestring,
-        deepseq,
-        hspec,
-        hspec-core >=2.11,
-        hspec-expectations-lifted,
-        HUnit,
-        mtl,
-        QuickCheck,
-        quickcheck-transformer,
-        prettyprinter >=1.7,
-        prettyprinter-ansi-terminal >=1.1.2,
-        random >=1.2,
-        text,
-        unliftio
+  build-depends:
+    HUnit,
+    QuickCheck,
+    base >=4.9 && <5,
+    bytestring,
+    deepseq,
+    hspec,
+    hspec-core >=2.11,
+    hspec-expectations-lifted,
+    mtl,
+    prettyprinter >=1.7,
+    prettyprinter-ansi-terminal >=1.1.2,
+    quickcheck-transformer,
+    random >=1.2,
+    text,
+    unliftio,
 
 test-suite tests
-    type:             exitcode-stdio-1.0
-    main-is:          Main.hs
-    hs-source-dirs:   test
-    other-modules:    Test.Suite.ImpSpec
-    default-language: Haskell2010
-    ghc-options:
-        -Wall -Wcompat -Wincomplete-record-updates
-        -Wincomplete-uni-patterns -Wredundant-constraints
-        -threaded -rtsopts
+  type: exitcode-stdio-1.0
+  main-is: Main.hs
+  hs-source-dirs: test
+  other-modules: Test.Suite.ImpSpec
+  default-language: Haskell2010
+  ghc-options:
+    -Wall
+    -Wcompat
+    -Wincomplete-record-updates
+    -Wincomplete-uni-patterns
+    -Wredundant-constraints
+    -threaded
+    -rtsopts
 
-    build-depends:
-        base,
-        ImpSpec
+  build-depends:
+    ImpSpec,
+    base,
+
+source-repository head
+  type: git
+  location: https://github.com/input-output-hk/ImpSpec
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -17,10 +17,10 @@
 |:--------------:|:---------:|:-------:|:-------:|:---:|
 | [![Build Status][GA-badge]][GA-link] | [![Coverage Status][Coveralls-badge]][Coveralls-link] | [![Hackage][Hackage-badge]][Hackage-link] | [![Nightly][Nightly-badge]][Nightly-link] | [![LTS][LTS-badge]][LTS-link]
 
-[GA-badge]: https://github.com/lehins/ImpSpec/workflows/CI/badge.svg
-[GA-link]: https://github.com/lehins/ImpSpec/actions
-[Coveralls-badge]: https://coveralls.io/repos/github/lehins/ImpSpec/badge.svg?branch=master
-[Coveralls-link]: https://coveralls.io/github/lehins/ImpSpec?branch=master
+[GA-badge]: https://github.com/input-output-hk/ImpSpec/workflows/CI/badge.svg
+[GA-link]: https://github.com/input-output-hk/ImpSpec/actions
+[Coveralls-badge]: https://coveralls.io/repos/github/input-output-hk/ImpSpec/badge.svg?branch=master
+[Coveralls-link]: https://coveralls.io/github/input-output-hk/ImpSpec?branch=master
 [Hackage-badge]: https://img.shields.io/hackage/v/ImpSpec.svg
 [Hackage-link]: https://hackage.haskell.org/package/ImpSpec
 [Nightly-badge]: https://www.stackage.org/package/ImpSpec/badge/nightly
diff --git a/src/Test/ImpSpec/Internal.hs b/src/Test/ImpSpec/Internal.hs
--- a/src/Test/ImpSpec/Internal.hs
+++ b/src/Test/ImpSpec/Internal.hs
@@ -13,6 +13,9 @@
 {-# LANGUAGE TypeFamilyDependencies #-}
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE UndecidableInstances #-}
+#if MIN_VERSION_random(1,3,0) && !MIN_VERSION_QuickCheck(2,16,1)
+{-# OPTIONS_GHC -Wno-orphans #-}
+#endif
 
 module Test.ImpSpec.Internal where
 
@@ -39,7 +42,11 @@
   vsep,
  )
 import Prettyprinter.Render.Terminal (AnsiStyle, Color (..), color, renderLazy)
-import System.Random (randomR, split)
+#if MIN_VERSION_random(1,3,0)
+import System.Random (randomR, SplitGen (splitGen))
+#else
+import System.Random (randomR, RandomGen (split))
+#endif
 import System.Random.Stateful (IOGenM, applyIOGen, newIOGenM)
 import Test.HUnit.Lang (FailureReason (..), HUnitFailure (..))
 import Test.Hspec (Spec, SpecWith, beforeAll, beforeAllWith)
@@ -68,6 +75,15 @@
 import Data.Monoid ((<>))
 #endif
 
+#if !MIN_VERSION_random(1,3,0)
+splitGen :: RandomGen g => g -> (g, g)
+splitGen = split
+#endif
+
+#if MIN_VERSION_random(1,3,0) && !MIN_VERSION_QuickCheck(2,16,1)
+deriving instance SplitGen QCGen
+#endif
+
 data ImpState t = ImpState
   { impStateSpecState :: !(ImpSpecState t)
   , impStateLog :: !(Doc AnsiStyle)
@@ -98,8 +114,11 @@
   { impInitEnv :: ImpSpecEnv t
   , impInitState :: ImpSpecState t
   }
+
 deriving instance (Eq (ImpSpecEnv t), Eq (ImpSpecState t)) => Eq (ImpInit t)
+
 deriving instance (Ord (ImpSpecEnv t), Ord (ImpSpecState t)) => Ord (ImpInit t)
+
 deriving instance (Show (ImpSpecEnv t), Show (ImpSpecState t)) => Show (ImpInit t)
 
 -- | Stores extra information about the failure of the unit test
@@ -134,30 +153,30 @@
 
 instance env ~ ImpSpecEnv t => MonadReader env (ImpM t) where
   ask = impEnvSpecEnv <$> ImpM ask
-  local f = ImpM . local (\e -> e{impEnvSpecEnv = f (impEnvSpecEnv e)}) . unImpM
+  local f = ImpM . local (\e -> e {impEnvSpecEnv = f (impEnvSpecEnv e)}) . unImpM
 
 instance Fail.MonadFail (ImpM t) where
   fail = liftIO . assertFailure
 
 instance s ~ ImpSpecState t => MonadState s (ImpM t) where
   state f = do
-    ImpEnv{impEnvStateRef} <- ImpM ask
+    ImpEnv {impEnvStateRef} <- ImpM ask
     curState <- readIORef impEnvStateRef
     let !(result, !newSpecState) = f $ impStateSpecState curState
-    writeIORef impEnvStateRef (curState{impStateSpecState = newSpecState})
+    writeIORef impEnvStateRef (curState {impStateSpecState = newSpecState})
     pure result
   get = fmap impStateSpecState . readIORef . impEnvStateRef =<< ImpM ask
 
 instance MonadGen (ImpM t) where
   liftGen (MkGen f) = do
     qcSize <- ImpM $ asks impEnvQCSize
-    qcGen <- applyQCGen split
+    qcGen <- applyQCGen splitGen
     pure $ f qcGen qcSize
   variant n action = do
     applyQCGen $ \qcGen -> ((), integerVariant (toInteger n) qcGen)
     action
   sized f = ImpM (asks impEnvQCSize) >>= f
-  resize n (ImpM f) = ImpM $ local (\env -> env{impEnvQCSize = n}) f
+  resize n (ImpM f) = ImpM $ local (\env -> env {impEnvQCSize = n}) f
   choose r = applyQCGen (randomR r)
 
 instance HasStatefulGen (IOGenM QCGen) (ImpM t) where
@@ -166,7 +185,7 @@
 instance (ImpSpec t, Testable a) => Testable (ImpM t a) where
   property m = property $ MkGen $ \qcGen qcSize ->
     ioProperty $ do
-      let (qcGen1, qcGen2) = split qcGen
+      let (qcGen1, qcGen2) = splitGen qcGen
       impInit <- impInitIO qcGen1
       evalImpM (Just qcGen2) (Just qcSize) impInit m
 
@@ -186,10 +205,10 @@
           (r, testable, logs) <- evalImpM (fst <$> mQC) (snd <$> mQC) impInit $ do
             t <- impTest x
             qcSize <- ImpM $ asks impEnvQCSize
-            qcGen <- applyQCGen split
+            qcGen <- applyQCGen splitGen
             logs <- getLogs
             pure (Just (qcGen, qcSize), t, logs)
-          let params' = params{paramsQuickCheckArgs = args{replay = r, chatty = False}}
+          let params' = params {paramsQuickCheckArgs = args {replay = r, chatty = False}}
           res <-
             evaluateExample
               (counterexample (ansiDocToString logs) testable)
@@ -212,11 +231,11 @@
 modifyLogs :: (Doc AnsiStyle -> Doc AnsiStyle) -> ImpM t ()
 modifyLogs f = do
   ref <- ImpM $ asks impEnvStateRef
-  modifyIORef ref $ \s -> s{impStateLog = f (impStateLog s)}
+  modifyIORef ref $ \s -> s {impStateLog = f (impStateLog s)}
 
 -- | Override the QuickCheck generator using a fixed seed.
 impSetSeed :: Int -> ImpM t ()
-impSetSeed seed = applyQCGen $ \_ -> ((), mkQCGen seed)
+impSetSeed seed = applyQCGen $ const ((), mkQCGen seed)
 
 evalImpGenM :: ImpSpec t => ImpInit t -> ImpM t b -> Gen (IO b)
 evalImpGenM impInit = fmap (fmap fst) . runImpGenM impInit
@@ -253,7 +272,7 @@
   ImpInit t ->
   ImpM t b ->
   IO (b, ImpState t)
-runImpM mQCGen mQCSize ImpInit{impInitEnv, impInitState} action = do
+runImpM mQCGen mQCSize ImpInit {impInitEnv, impInitState} action = do
   let qcSize = fromMaybe 30 mQCSize
       qcGen = fromMaybe (mkQCGen 2024) mQCGen
   ioRef <-
@@ -364,7 +383,7 @@
 logWithCallStack callStack entry =
   modifyLogs (<> stack <> line <> indent 2 entry <> line)
   where
-    prettySrcLoc' SrcLoc{srcLocModule, srcLocStartLine} =
+    prettySrcLoc' SrcLoc {srcLocModule, srcLocStartLine} =
       hcat
         [ annotate (color c) d
         | (c, d) <-
diff --git a/src/Test/ImpSpec/Random.hs b/src/Test/ImpSpec/Random.hs
--- a/src/Test/ImpSpec/Random.hs
+++ b/src/Test/ImpSpec/Random.hs
@@ -1,9 +1,9 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DefaultSignatures #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE FunctionalDependencies #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE UndecidableInstances #-}
 
@@ -35,6 +35,7 @@
   askStatefulGen = ReaderT (pure . getGenEnv)
 
 uniformM ::
+  forall a g m.
   ( HasStatefulGen g m
   , R.Uniform a
   ) =>
@@ -43,6 +44,7 @@
 {-# INLINE uniformM #-}
 
 uniformRM ::
+  forall a g m.
   ( HasStatefulGen g m
   , R.UniformRange a
   ) =>
@@ -52,6 +54,7 @@
 {-# INLINE uniformRM #-}
 
 uniformListM ::
+  forall a g m.
   ( HasStatefulGen g m
   , R.Uniform a
   ) =>
@@ -61,6 +64,7 @@
 {-# INLINE uniformListM #-}
 
 uniformListRM ::
+  forall a g m.
   (HasStatefulGen g m, R.UniformRange a) =>
   (a, a) ->
   Int ->
@@ -73,9 +77,15 @@
 {-# INLINE uniformByteStringM #-}
 
 uniformShortByteStringM :: HasStatefulGen a m => Int -> m ShortByteString
+#if MIN_VERSION_random(1,3,0)
+uniformShortByteStringM n = askStatefulGen >>= R.uniformShortByteStringM n
+#else
 uniformShortByteStringM n = askStatefulGen >>= R.uniformShortByteString n
+#endif
 {-# INLINE uniformShortByteStringM #-}
 
 -- | Lifted version of `QC.arbitrary`.
-arbitrary :: (QC.Arbitrary a, MonadGen m) => m a
+arbitrary ::
+  forall a m.
+  (QC.Arbitrary a, MonadGen m) => m a
 arbitrary = liftGen QC.arbitrary
