diff --git a/BitStringRandomMonad.cabal b/BitStringRandomMonad.cabal
--- a/BitStringRandomMonad.cabal
+++ b/BitStringRandomMonad.cabal
@@ -2,7 +2,7 @@
 --  documentation, see http://haskell.org/cabal/users-guide/
 
 name:                BitStringRandomMonad
-version:             0.1.0.0
+version:             0.1.1.1
 description:         A library which turns a bytestring into a random monad.
                      Input could be any PRNG which can output a lazy
                      bytestring.
diff --git a/Crypto/RandomMonad.hs b/Crypto/RandomMonad.hs
--- a/Crypto/RandomMonad.hs
+++ b/Crypto/RandomMonad.hs
@@ -2,7 +2,7 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE TypeFamilies #-}
 
-module Crypto.RandomMonad (RndT, RndST, RndIO, Rnd, RndState, getRandomM, getRandom2M, runRndT, newRandomElementST, getRandomElement, randomElementsLength, replaceSeedM, addSeedM, getRandomByteStringM) where
+module Crypto.RandomMonad (RndT, RndST, RndIO, Rnd, RndState, getRandomM, getRandom2M, runRndT, newRandomElementST, getRandomElement, randomElementsLength, replaceSeedM, addSeedM, getRandomByteStringM, RandomElementsListST()) where
 
 import Control.Exception (Exception, throw)
 import Control.Monad.Identity (Identity)
@@ -21,6 +21,7 @@
 import qualified Data.Vector.Unboxed.Mutable as VM
 
 data BitStringToRandomExceptions = OutOfElementsException deriving (Show, Typeable)
+data RandomElementsListST s a = RandomElementsListST (STRef s (V.Vector a))
 instance Exception BitStringToRandomExceptions
 
 bitsNeeded :: Integer -> Integer
@@ -70,11 +71,11 @@
 getRandomByteString 0 x = (ByS.pack [], x)
 getRandomByteString len x = let (byte, newState) = getRandom 255 x ; (allBytes, lastState) = getRandomByteString (len - 1) newState in (ByS.cons (fromIntegral byte) allBytes, lastState)
 
-newRandomElementST :: VM.Unbox a => [a] -> ST s (STRef s (V.Vector a))
-newRandomElementST acc = newSTRef $ V.fromList acc
+newRandomElementST :: VM.Unbox a => [a] -> ST s (RandomElementsListST s a)
+newRandomElementST acc = (newSTRef $ V.fromList acc) >>= \ref -> return $ RandomElementsListST ref
 
-getRandomElement :: (V.Unbox a) => STRef s (V.Vector a) -> RndST s a
-getRandomElement ref = do
+getRandomElement :: VM.Unbox a => (RandomElementsListST s a) -> RndST s a
+getRandomElement (RandomElementsListST ref) = do
   vec <- lift $ readSTRef ref
   vec' <- lift $ V.unsafeThaw vec
   let n = toInteger $ VM.length vec'
@@ -88,7 +89,8 @@
   lift $ writeSTRef ref $ V.unsafeTail vec''
   return ab
 
-randomElementsLength ref = do
+randomElementsLength :: (VM.Unbox a) => RandomElementsListST s a -> RndST s Int
+randomElementsLength (RandomElementsListST ref) = do
   vec <- lift $ readSTRef ref
   return $ V.length vec
 
