diff --git a/opentheory-primitive.cabal b/opentheory-primitive.cabal
--- a/opentheory-primitive.cabal
+++ b/opentheory-primitive.cabal
@@ -1,10 +1,10 @@
 name: opentheory-primitive
-version: 1.2
+version: 1.3
 category: Formal Methods
 synopsis: Haskell primitives used by OpenTheory packages
 license: MIT
 license-file: LICENSE
-cabal-version: >= 1.8.0.6
+cabal-version: >= 1.8.0.2
 build-type: Simple
 author: Joe Leslie-Hurd <joe@gilith.com>
 maintainer: Joe Leslie-Hurd <joe@gilith.com>
@@ -40,4 +40,4 @@
 
   ghc-options: -Wall
 
-  main-is: Test.hs
+  main-is: Main.hs
diff --git a/src/OpenTheory/Primitive/Byte.hs b/src/OpenTheory/Primitive/Byte.hs
--- a/src/OpenTheory/Primitive/Byte.hs
+++ b/src/OpenTheory/Primitive/Byte.hs
@@ -15,23 +15,24 @@
     not,
     or,
     shiftLeft,
-    shiftRight )
+    shiftRight,
+    toNatural )
 where
 
 import Prelude (Bool, (<), (&&), fromIntegral)
 import qualified Data.Bits
 import qualified Data.Word
-import qualified OpenTheory.Primitive.Natural as Primitive.Natural
+import qualified OpenTheory.Primitive.Natural as Natural
 
 type Byte = Data.Word.Word8
 
 and :: Byte -> Byte -> Byte
 and w1 w2 = (Data.Bits..&.) w1 w2
 
-bit :: Byte -> Primitive.Natural.Natural -> Bool
+bit :: Byte -> Natural.Natural -> Bool
 bit w i = i < 8 && Data.Bits.testBit w (fromIntegral i)
 
-fromNatural :: Primitive.Natural.Natural -> Byte
+fromNatural :: Natural.Natural -> Byte
 fromNatural = fromIntegral
 
 not :: Byte -> Byte
@@ -40,10 +41,13 @@
 or :: Byte -> Byte -> Byte
 or w1 w2 = (Data.Bits..|.) w1 w2
 
-shiftLeft :: Byte -> Primitive.Natural.Natural -> Byte
+shiftLeft :: Byte -> Natural.Natural -> Byte
 shiftLeft w n =
     if n < 8 then (Data.Bits.shiftL) w (fromIntegral n) else 0
 
-shiftRight :: Byte -> Primitive.Natural.Natural -> Byte
+shiftRight :: Byte -> Natural.Natural -> Byte
 shiftRight w n =
     if n < 8 then (Data.Bits.shiftR) w (fromIntegral n) else 0
+
+toNatural :: Byte -> Natural.Natural
+toNatural = fromIntegral
diff --git a/src/OpenTheory/Primitive/Natural.hs b/src/OpenTheory/Primitive/Natural.hs
--- a/src/OpenTheory/Primitive/Natural.hs
+++ b/src/OpenTheory/Primitive/Natural.hs
@@ -11,6 +11,8 @@
   ( Natural )
 where
 
+import qualified Test.QuickCheck
+
 newtype Natural =
     Natural { unNatural :: Integer }
   deriving Eq
@@ -67,3 +69,9 @@
           in (Natural q, Natural r)
 
   toInteger = unNatural
+
+instance Test.QuickCheck.Arbitrary Natural where
+  arbitrary = fmap fromRandomInteger Test.QuickCheck.arbitrary
+      where
+    fromRandomInteger x =
+      Natural (if x < 0 then -(x + 1) else x)
diff --git a/src/OpenTheory/Primitive/Random.hs b/src/OpenTheory/Primitive/Random.hs
--- a/src/OpenTheory/Primitive/Random.hs
+++ b/src/OpenTheory/Primitive/Random.hs
@@ -28,10 +28,8 @@
 instance Show Random where
   show r = "Random<" ++ show (seed r) ++ ">"
 
-bit :: Random -> (Bool,Random)
-bit r =
-  let (b,g) = System.Random.random (gen r) in
-  (b, r {gen = g})
+bit :: Random -> Bool
+bit r = fst (System.Random.random (gen r))
 
 split :: Random -> (Random,Random)
 split r =
diff --git a/testsrc/Main.hs b/testsrc/Main.hs
new file mode 100644
--- /dev/null
+++ b/testsrc/Main.hs
@@ -0,0 +1,37 @@
+{- |
+Module: $Header$
+Description: OpenTheory QuickCheck interface
+License: MIT
+
+Maintainer: Joe Leslie-Hurd <joe@gilith.com>
+Stability: provisional
+Portability: portable
+
+OpenTheory QuickCheck interface
+-}
+module Main
+  ( main )
+where
+
+import OpenTheory.Primitive.Natural
+import OpenTheory.Primitive.Test
+
+assertion0 :: Bool
+assertion0 = True
+
+assertion1 :: Bool
+assertion1 = (2 :: Natural) + 2 == 4
+
+proposition0 :: Bool -> Bool
+proposition0 p = p || not p
+
+proposition1 :: Natural -> Natural -> Bool
+proposition1 m n = m + n == n + m
+
+main :: IO ()
+main =
+    do assert "Assertion 0:\n  T\n  " assertion0
+       assert "Assertion 1:\n  2 + 2 = 4\n  " assertion1
+       check "Proposition 0:\n  !p. p \\/ ~p\n  " proposition0
+       check "Proposition 1:\n  !m n. m + n = n + m\n  " proposition1
+       return ()
diff --git a/testsrc/Test.hs b/testsrc/Test.hs
deleted file mode 100644
--- a/testsrc/Test.hs
+++ /dev/null
@@ -1,31 +0,0 @@
-{- |
-Module: $Header$
-Description: OpenTheory QuickCheck interface
-License: MIT
-
-Maintainer: Joe Leslie-Hurd <joe@gilith.com>
-Stability: provisional
-Portability: portable
-
-OpenTheory QuickCheck interface
--}
-module Main
-  ( main )
-where
-
-import qualified OpenTheory.Primitive.Random as Primitive.Random
-import qualified OpenTheory.Primitive.Test as Primitive.Test
-
-assertion0 :: Bool
-assertion0 = True
-
-proposition0 :: Primitive.Random.Random -> Bool
-proposition0 r =
-  let (p,_) = Primitive.Random.bit r in
-  p || not p
-
-main :: IO ()
-main =
-    do Primitive.Test.assert "Assertion 0:\n  T\n  " assertion0
-       Primitive.Test.check "Proposition 0:\n  !p. p \\/ ~p\n  " proposition0
-       return ()
