diff --git a/monad-bayes.cabal b/monad-bayes.cabal
--- a/monad-bayes.cabal
+++ b/monad-bayes.cabal
@@ -1,15 +1,13 @@
 cabal-version:   2.2
 name:            monad-bayes
-version:         1.3.0.4
+version:         1.3.0.5
 license:         MIT
 license-file:    LICENSE.md
 copyright:       2015-2020 Adam Scibior
 maintainer:      dominic.steinitz@tweag.io
 author:          Adam Scibior <adscib@gmail.com>
 stability:       experimental
-tested-with:
-  GHC ==9.0.2 || ==9.2.7 || ==9.4.5 || ==9.6.4 || ==9.8.2 || ==9.10.1
-
+tested-with:     GHC ==9.0 || ==9.2 || ==9.4 || ==9.6 || ==9.8 || ==9.10
 homepage:        http://github.com/tweag/monad-bayes#readme
 bug-reports:     https://github.com/tweag/monad-bayes/issues
 synopsis:        A library for probabilistic programming.
@@ -40,8 +38,8 @@
 
 common deps
   build-depends:
-    , base             >=4.15     && <4.21
-    , brick            >=2.3.1    && <2.6
+    , base             >=4.15     && <4.22
+    , brick            ^>=2.10
     , containers       >=0.6      && <0.8
     , foldl            ^>=1.4
     , free             ^>=5.2
@@ -67,7 +65,7 @@
     , text             >=1.2      && <2.2
     , transformers     >=0.5.6    && <0.7
     , vector           >=0.12.0   && <0.14
-    , vty              >=6.1      && <6.3
+    , vty              >=6.4      && <6.6
     , vty-unix         ^>=0.2.0.0
 
 common test-deps
diff --git a/src/Control/Monad/Bayes/Class.hs b/src/Control/Monad/Bayes/Class.hs
--- a/src/Control/Monad/Bayes/Class.hs
+++ b/src/Control/Monad/Bayes/Class.hs
@@ -71,6 +71,8 @@
     Measure,
     Kernel,
     Log (ln, Exp),
+    MonadUniformRange,
+    uniformR,
   )
 where
 
@@ -105,6 +107,7 @@
 import Statistics.Distribution.Normal (normalDistr)
 import Statistics.Distribution.Poisson qualified as Poisson
 import Statistics.Distribution.Uniform (uniformDistr)
+import System.Random (UniformRange)
 
 -- | Monads that can draw random variables.
 class (Monad m) => MonadDistribution m where
@@ -114,6 +117,8 @@
     m Double
 
   -- | Draw from a uniform distribution.
+  --
+  -- See also 'MonadUniformRange.uniformR' for types other than 'Double'.
   uniform ::
     -- | lower bound a
     Double ->
@@ -339,6 +344,19 @@
 histogramToList :: Histogram -> [(Double, Double)]
 histogramToList = H.asList
 
+-- | Monads that can efficiently draw uniform variables of
+-- 'UniformRange' types.
+class (Monad m) => MonadUniformRange m where
+  -- | Draw from a uniform distribution for some 'UniformRange' type.
+  uniformR ::
+    (UniformRange a) =>
+    -- | lower bound l (inclusive for discrete types)
+    a ->
+    -- | upper bound u (inclusive for discrete types)
+    a ->
+    -- | \(\sim \mathcal{U}(l, u)\).
+    m a
+
 ----------------------------------------------------------------------------
 -- Instances that lift probabilistic effects to standard tranformers.
 
@@ -351,6 +369,9 @@
 
 instance (MonadMeasure m) => MonadMeasure (IdentityT m)
 
+instance (MonadUniformRange m) => MonadUniformRange (IdentityT m) where
+  uniformR l u = lift $ uniformR l u
+
 instance (MonadDistribution m) => MonadDistribution (ExceptT e m) where
   random = lift random
   uniformD = lift . uniformD
@@ -364,11 +385,17 @@
   random = lift random
   bernoulli = lift . bernoulli
 
+instance (MonadUniformRange m) => MonadUniformRange (ExceptT e m) where
+  uniformR l u = lift $ uniformR l u
+
 instance (MonadFactor m) => MonadFactor (ReaderT r m) where
   score = lift . score
 
 instance (MonadMeasure m) => MonadMeasure (ReaderT r m)
 
+instance (MonadUniformRange m) => MonadUniformRange (ReaderT r m) where
+  uniformR l u = lift $ uniformR l u
+
 instance (Monoid w, MonadDistribution m) => MonadDistribution (WriterT w m) where
   random = lift random
   bernoulli = lift . bernoulli
@@ -379,6 +406,9 @@
 
 instance (Monoid w, MonadMeasure m) => MonadMeasure (WriterT w m)
 
+instance (Monoid w, MonadUniformRange m) => MonadUniformRange (WriterT w m) where
+  uniformR l u = lift $ uniformR l u
+
 instance (MonadDistribution m) => MonadDistribution (StateT s m) where
   random = lift random
   bernoulli = lift . bernoulli
@@ -390,6 +420,9 @@
 
 instance (MonadMeasure m) => MonadMeasure (StateT s m)
 
+instance (MonadUniformRange m) => MonadUniformRange (StateT s m) where
+  uniformR l u = lift $ uniformR l u
+
 instance (MonadDistribution m) => MonadDistribution (ContT r m) where
   random = lift random
 
@@ -397,3 +430,6 @@
   score = lift . score
 
 instance (MonadMeasure m) => MonadMeasure (ContT r m)
+
+instance (MonadUniformRange m) => MonadUniformRange (ContT r m) where
+  uniformR l u = lift $ uniformR l u
diff --git a/src/Control/Monad/Bayes/Inference/SMC2.hs b/src/Control/Monad/Bayes/Inference/SMC2.hs
--- a/src/Control/Monad/Bayes/Inference/SMC2.hs
+++ b/src/Control/Monad/Bayes/Inference/SMC2.hs
@@ -23,6 +23,7 @@
   ( MonadDistribution (random),
     MonadFactor (..),
     MonadMeasure,
+    MonadUniformRange (uniformR),
   )
 import Control.Monad.Bayes.Inference.MCMC
 import Control.Monad.Bayes.Inference.RMSMC (rmsmc)
@@ -45,6 +46,9 @@
 
 instance (MonadDistribution m) => MonadDistribution (SMC2 m) where
   random = lift random
+
+instance (MonadUniformRange m) => MonadUniformRange (SMC2 m) where
+  uniformR l u = lift $ uniformR l u
 
 instance (Monad m) => MonadFactor (SMC2 m) where
   score = SMC2 . score
diff --git a/src/Control/Monad/Bayes/Population.hs b/src/Control/Monad/Bayes/Population.hs
--- a/src/Control/Monad/Bayes/Population.hs
+++ b/src/Control/Monad/Bayes/Population.hs
@@ -45,6 +45,7 @@
   ( MonadDistribution (..),
     MonadFactor (..),
     MonadMeasure,
+    MonadUniformRange (..),
     factor,
   )
 import Control.Monad.Bayes.Weighted
@@ -95,6 +96,9 @@
   bernoulli = lift . bernoulli
   categorical = lift . categorical
 
+instance (MonadUniformRange m) => MonadUniformRange (ListT m) where
+  uniformR l u = lift $ uniformR l u
+
 instance (MonadFactor m) => MonadFactor (ListT m) where
   score = lift . score
 
@@ -102,7 +106,7 @@
 
 -- | A collection of weighted samples, or particles.
 newtype PopulationT m a = PopulationT {getPopulationT :: WeightedT (ListT m) a}
-  deriving newtype (Functor, Applicative, Monad, MonadIO, MonadDistribution, MonadFactor, MonadMeasure)
+  deriving newtype (Functor, Applicative, Monad, MonadIO, MonadDistribution, MonadFactor, MonadMeasure, MonadUniformRange)
 
 instance MonadTrans PopulationT where
   lift = PopulationT . lift . lift
diff --git a/src/Control/Monad/Bayes/Sampler/Strict.hs b/src/Control/Monad/Bayes/Sampler/Strict.hs
--- a/src/Control/Monad/Bayes/Sampler/Strict.hs
+++ b/src/Control/Monad/Bayes/Sampler/Strict.hs
@@ -2,6 +2,8 @@
 {-# LANGUAGE DerivingStrategies #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE ImportQualifiedPost #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
 
 -- |
 -- Module      : Control.Monad.Bayes.Sampler
@@ -39,7 +41,11 @@
         random,
         uniform
       ),
+    MonadUniformRange
+      ( uniformR
+      ),
   )
+import Control.Monad.Primitive (PrimMonad)
 import Control.Monad.Reader (MonadIO, ReaderT (..))
 import Control.Monad.ST (ST)
 import Control.Monad.Trans (MonadTrans)
@@ -49,7 +55,7 @@
 
 -- | The sampling interpretation of a probabilistic program
 -- Here m is typically IO or ST
-newtype SamplerT g m a = SamplerT {runSamplerT :: ReaderT g m a} deriving (Functor, Applicative, Monad, MonadIO, MonadTrans)
+newtype SamplerT g m a = SamplerT {runSamplerT :: ReaderT g m a} deriving (Functor, Applicative, Monad, MonadIO, MonadTrans, PrimMonad)
 
 -- | convenient type synonym to show specializations of SamplerT
 -- to particular pairs of monad and RNG
@@ -70,6 +76,9 @@
   bernoulli p = SamplerT (ReaderT $ MWC.bernoulli p)
   categorical ps = SamplerT (ReaderT $ MWC.categorical ps)
   geometric p = SamplerT (ReaderT $ MWC.geometric0 p)
+
+instance (StatefulGen g m) => MonadUniformRange (SamplerT g m) where
+  uniformR l u = SamplerT (ReaderT $ uniformRM (l, u))
 
 -- | Sample with a random number generator of your choice e.g. the one
 -- from `System.Random`.
diff --git a/src/Control/Monad/Bayes/Weighted.hs b/src/Control/Monad/Bayes/Weighted.hs
--- a/src/Control/Monad/Bayes/Weighted.hs
+++ b/src/Control/Monad/Bayes/Weighted.hs
@@ -28,6 +28,7 @@
   ( MonadDistribution,
     MonadFactor (..),
     MonadMeasure,
+    MonadUniformRange,
     factor,
   )
 import Control.Monad.State (MonadIO, MonadTrans, StateT (..), lift, mapStateT, modify)
@@ -36,7 +37,7 @@
 -- | Execute the program using the prior distribution, while accumulating likelihood.
 newtype WeightedT m a = WeightedT (StateT (Log Double) m a)
   -- StateT is more efficient than WriterT
-  deriving newtype (Functor, Applicative, Monad, MonadIO, MonadTrans, MonadDistribution)
+  deriving newtype (Functor, Applicative, Monad, MonadIO, MonadTrans, MonadDistribution, MonadUniformRange)
 
 instance (Monad m) => MonadFactor (WeightedT m) where
   score w = WeightedT (modify (* w))
