diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+1.2
+
+- add MonadCatch and MonadFail instances
+- add uniformInteger generator
+
 1.1
 
 - add sampleRunT and samplesRunT: both return the final state of the PRNG as a tuple of Word64
diff --git a/splitmix-distributions.cabal b/splitmix-distributions.cabal
--- a/splitmix-distributions.cabal
+++ b/splitmix-distributions.cabal
@@ -1,5 +1,5 @@
 name:           splitmix-distributions
-version:        1.1.0
+version:        1.2.0
 description:    Random samplers for some common distributions, as well as a convenient interface for composing them, based on splitmix. Please see the README on GitHub at <https://github.com/ocramz/splitmix-distributions#readme>
 homepage:       https://github.com/ocramz/splitmix-distributions#readme
 bug-reports:    https://github.com/ocramz/splitmix-distributions/issues
diff --git a/src/System/Random/SplitMix/Distributions.hs b/src/System/Random/SplitMix/Distributions.hs
--- a/src/System/Random/SplitMix/Distributions.hs
+++ b/src/System/Random/SplitMix/Distributions.hs
@@ -51,6 +51,7 @@
   laplace,
   weibull,
   -- ** Discrete
+  uniformInteger,
   bernoulli, fairCoin,
   multinomial,
   categorical,
@@ -86,13 +87,13 @@
 -- erf
 import Data.Number.Erf (InvErf(..))
 -- exceptions
-import Control.Monad.Catch (MonadThrow(..))
+import Control.Monad.Catch (MonadThrow(..), MonadCatch(..))
 -- mtl
 import Control.Monad.Trans.Class (MonadTrans(..))
 import Control.Monad.Reader (MonadReader(..))
 import Control.Monad.State (MonadState(..), modify)
 -- splitmix
-import System.Random.SplitMix (SMGen, mkSMGen, seedSMGen', initSMGen, unseedSMGen, splitSMGen, nextDouble)
+import System.Random.SplitMix (SMGen, mkSMGen, seedSMGen', initSMGen, unseedSMGen, splitSMGen, nextDouble, nextInteger)
 -- transformers
 import Control.Monad.Trans.Reader (ReaderT(..))
 import Control.Monad.Trans.State (StateT(..), runStateT, evalStateT, State, runState, evalState)
@@ -102,7 +103,8 @@
 -- wraps 'splitmix' state-passing inside a 'StateT' monad
 --
 -- useful for embedding random generation inside a larger effect stack
-newtype GenT m a = GenT { unGen :: StateT SMGen m a } deriving (Functor, Applicative, Monad, MonadTrans, MonadIO, MonadThrow, MonadReader r)
+newtype GenT m a = GenT { unGen :: StateT SMGen m a }
+  deriving (Functor, Applicative, Monad, MonadTrans, MonadIO, MonadThrow, MonadCatch, MonadReader r, MonadFail)
 
 instance MonadState s m => MonadState s (GenT m) where
   get = lift get
@@ -180,6 +182,10 @@
         -> Gen a
         -> [a]
 samples n seed gg = sample seed (replicateM n gg)
+
+-- | Uniform integer in the interval [a, b]
+uniformInteger :: Monad m => Integer -> Integer -> GenT m Integer
+uniformInteger a b = withGen (nextInteger a b)
 
 -- | Bernoulli trial
 bernoulli :: Monad m =>
