diff --git a/System/Random/MWC/Distributions/Monad.hs b/System/Random/MWC/Distributions/Monad.hs
--- a/System/Random/MWC/Distributions/Monad.hs
+++ b/System/Random/MWC/Distributions/Monad.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleContexts #-}
 -- |
 -- Module    : System.Random.MWC.Monad
@@ -29,12 +30,15 @@
     -- * Permutations
   , uniformPermutation
   , uniformShuffle
+  , uniformShuffleM
   ) where
 
+import Control.Monad.Primitive       (PrimState)
 import Control.Monad.Primitive.Class (MonadPrim(..))
 
-import Data.Vector.Generic (Vector)
-import Data.Traversable    (Traversable)
+import Data.Vector.Generic         (Vector)
+import Data.Vector.Generic.Mutable (MVector)
+import Data.Traversable            (Traversable)
 import qualified System.Random.MWC.Distributions as MWC
 import System.Random.MWC.Monad
 
@@ -148,8 +152,16 @@
 
 -- | Random variate generator for a uniformly distributed shuffle of a
 --   vector.
-uniformShuffle :: (MonadPrim m, Vector v a, Vector v Int)
+uniformShuffle :: (MonadPrim m, Vector v a)
                => v a
                -> Rand m (v a)
 {-# INLINE uniformShuffle #-}
 uniformShuffle xs = toRand $ \g -> MWC.uniformShuffle xs g
+
+-- | In-place uniformly distributed shuffle (all shuffles are
+--   equiprobable) of a vector.
+uniformShuffleM :: (MonadPrim m, MVector v a, PrimState m ~ PrimState (BasePrimMonad m))
+                => v (PrimState m) a
+                -> Rand m ()
+uniformShuffleM xs = toRand $ \g -> MWC.uniformShuffleM xs g
+{-# INLINE uniformShuffleM #-}
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
@@ -42,7 +42,7 @@
 import Control.Monad.Trans.Class (MonadTrans(..))
 import Control.Monad.IO.Class    (MonadIO(..))
 import Control.Monad.ST          (ST)
-import Control.Monad.Primitive   (PrimMonad, PrimState)
+import Control.Monad.Primitive   (PrimState)
 import Control.Monad.Primitive.Class (MonadPrim(..))
 
 import Data.Word               (Word32)
@@ -124,8 +124,9 @@
 {-# INLINE runWithSeed #-}
 
 -- | Run monad using system random
-runWithSystemRandom :: (MonadPrim m, BasePrimMonad m ~ m) => Rand m a -> IO a
-runWithSystemRandom = MWC.withSystemRandom . runRand
+runWithSystemRandom :: (MonadPrim m, BasePrimMonad m ~ IO) => Rand m a -> m a
+runWithSystemRandom rnd
+  = runRand rnd =<< liftPrim MWC.createSystemRandom
 {-# INLINE runWithSystemRandom #-}
 
 
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.7.1.0
+Version:             0.7.2.0
 License:             BSD3
 License-file:        LICENSE
 Author:              Alexey Khudyakov <alexey.skladnoy@gmail.com>
@@ -21,7 +21,7 @@
     primitive,
     monad-primitive,
     vector     >= 0.7,
-    mwc-random >= 0.13.2.0
+    mwc-random >= 0.13.3.0
   Exposed-modules:
     System.Random.MWC.Monad
     System.Random.MWC.Distributions.Monad
