diff --git a/System/Random/MWC/Monad.hs b/System/Random/MWC/Monad.hs
--- a/System/Random/MWC/Monad.hs
+++ b/System/Random/MWC/Monad.hs
@@ -15,7 +15,6 @@
     -- * Random monad
     Rand
   , toRand
-  , liftR
     -- ** Type syhnonims
   , RandIO
   , asRandIO
@@ -38,9 +37,11 @@
   ) where
 
 import Control.Applicative
-import Control.Monad           (ap)
-import Control.Monad.ST        (ST)
-import Control.Monad.Primitive (PrimMonad, PrimState)
+import Control.Monad             (ap)
+import Control.Monad.Trans.Class (MonadTrans(..))
+import Control.Monad.IO.Class    (MonadIO(..))
+import Control.Monad.ST          (ST)
+import Control.Monad.Primitive   (PrimMonad, PrimState)
 
 import Data.Word               (Word32)
 import qualified Data.Vector.Generic as G
@@ -56,11 +57,32 @@
   runRand :: Gen (PrimState m) -> m a
   }
 
--- | Lift monadic action into 'Rand' monad
-liftR :: PrimMonad m => m a -> Rand m a
-liftR m = Rand $ const m
-{-# INLINE liftR #-}
+instance (Monad m) => Functor (Rand m) where
+  fmap f (Rand rnd) = Rand $ \g -> (return . f) =<< (rnd g)
+  {-# INLINE fmap #-}
 
+instance (Monad m) => Monad (Rand m) where
+  return           = Rand . const . return
+  (Rand rnd) >>= f = Rand $ \g -> (\x -> runRand (f x) g) =<< rnd g
+  {-# INLINE return #-}
+  {-# INLINE (>>=)  #-}
+
+instance (Monad m) => Applicative (Rand m) where
+  pure  = return
+  (<*>) = ap
+  {-# INLINE pure  #-}
+  {-# INLINE (<*>) #-}
+
+instance MonadTrans Rand where
+  lift = Rand . const
+  {-# INLINE lift #-}
+
+instance MonadIO m => MonadIO (Rand m) where
+  liftIO = lift . liftIO
+  {-# INLINE liftIO #-}
+
+
+
 -- | Type synonim for ST-based Rand monad
 type RandST s a = Rand (ST s) a
 
@@ -77,6 +99,10 @@
 asRandIO = id
 {-# INLINE asRandIO #-}
 
+
+
+----------------------------------------------------------------
+
 -- | Run monad using fixed seed
 runWithCreate :: PrimMonad m => Rand m a -> m a
 runWithCreate m = runRand m =<< MWC.create
@@ -97,22 +123,8 @@
 runWithSystemRandom = MWC.withSystemRandom . runRand
 {-# INLINE runWithSystemRandom #-}
 
-instance PrimMonad m => Functor (Rand m) where
-  fmap f (Rand rnd) = Rand $ \g -> (return . f) =<< (rnd g)
-  {-# INLINE fmap #-}
 
-instance PrimMonad m => Monad (Rand m) where
-  return           = Rand . const . return
-  (Rand rnd) >>= f = Rand $ \g -> (\x -> runRand (f x) g) =<< rnd g
-  {-# INLINE return #-}
-  {-# INLINE (>>=)  #-}
 
-instance (PrimMonad m) => Applicative (Rand m) where
-  pure  = return
-  (<*>) = ap
-  {-# INLINE pure  #-}
-  {-# INLINE (<*>) #-}
-
 ----------------------------------------------------------------
 
 -- | Convert function to Rand monad
@@ -129,6 +141,7 @@
 uniformR :: (PrimMonad m, Variate a) => (a,a) -> Rand m a
 uniformR rng = Rand $ \g -> MWC.uniformR rng g
 {-# INLINE uniformR #-}
+
 
 
 ----------------------------------------------------------------
diff --git a/mwc-random-monad.cabal b/mwc-random-monad.cabal
--- a/mwc-random-monad.cabal
+++ b/mwc-random-monad.cabal
@@ -1,5 +1,5 @@
 Name:                mwc-random-monad
-Version:             0.4
+Version:             0.5
 License:             BSD3
 License-file:        LICENSE
 Author:              Alexey Khudyakov <alexey.skladnoy@gmail.com>
@@ -15,6 +15,7 @@
 Library
   build-depends:
     base >= 3 && < 5,
+    transformers,
     primitive,
     vector >= 0.7,
     mwc-random >= 0.11
