diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: snowchecked
-version: 0.0.0.1
+version: 0.0.0.3
 github: robertfischer/hs-snowflake-checked
 license: Apache-2.0
 author: Robert Fischer
diff --git a/snowchecked.cabal b/snowchecked.cabal
--- a/snowchecked.cabal
+++ b/snowchecked.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           snowchecked
-version:        0.0.0.1
+version:        0.0.0.3
 synopsis:       A checksummed variation on Twitter's Snowflake UID generation algorithm
 description:    See the file ./README.md, which is included in the package and also on GitHub.
 category:       Data
@@ -55,6 +55,10 @@
   type: exitcode-stdio-1.0
   main-is: Spec.hs
   other-modules:
+      Gens
+      Integer
+      Word32
+      Word64
       Paths_snowchecked
   hs-source-dirs:
       test
diff --git a/test/Gens.hs b/test/Gens.hs
new file mode 100644
--- /dev/null
+++ b/test/Gens.hs
@@ -0,0 +1,35 @@
+{-# LANGUAGE TypeApplications #-}
+
+module Gens (module Gens) where
+
+import           Control.Monad          (unless, void)
+import           Control.Monad.IO.Class (MonadIO)
+import           Data.List              (nub)
+import           Data.Snowchecked
+import           Data.WideWord.Word256
+import           Data.Word
+import           Hedgehog
+import qualified Hedgehog.Gen           as Gen
+import           Hedgehog.Main          (defaultMain)
+import qualified Hedgehog.Range         as Range
+
+genWord8 :: (MonadGen m) => m Word8
+genWord8 = Gen.word8 $ Range.linear (minBound @Word8) (maxBound @Word8)
+
+genWord256 :: (MonadGen m) => m Word256
+genWord256 = Gen.integral $ Range.linear (minBound @Word256) (maxBound @Word256)
+
+genConfig :: (MonadGen m) => m SnowcheckedConfig
+genConfig = SnowcheckedConfig
+		<$> Gen.integral (Range.linear 2 (maxBound @Word8))
+		<*> Gen.integral (Range.linear 2 (maxBound @Word8))
+		<*> Gen.integral (Range.linear 2 (maxBound @Word8))
+		<*> Gen.integral (Range.linear 2 (maxBound @Word8))
+
+forAllFlake :: (MonadIO m) => PropertyT m Flake
+forAllFlake = forAll genConfig >>= forAllFlake'
+
+forAllFlake' :: (MonadIO m) => SnowcheckedConfig -> PropertyT m Flake
+forAllFlake' cfg = do
+	nodeId <- forAll genWord256
+	newSnowcheckedGen cfg nodeId >>= nextFlake
diff --git a/test/Integer.hs b/test/Integer.hs
new file mode 100644
--- /dev/null
+++ b/test/Integer.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE TemplateHaskell  #-}
+{-# LANGUAGE TypeApplications #-}
+
+module Integer (tests) where
+
+import           Data.Snowchecked
+import           Data.Snowchecked.Encoding.Integral
+import           Gens
+import           Hedgehog
+
+tests :: IO Bool
+tests = checkParallel $$(discover)
+
+prop_flakeToIntegerToFlake :: Property
+prop_flakeToIntegerToFlake = property $ do
+		cfg <- forAll genConfig
+		flake <- forAllFlake' cfg
+		let value = fromFlake @Integer flake
+		let result = parseFlake cfg value 
+		result === Just flake
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -8,39 +8,28 @@
 import           Data.Snowchecked
 import           Data.WideWord.Word256
 import           Data.Word
+import           Gens
 import           Hedgehog
 import qualified Hedgehog.Gen           as Gen
 import           Hedgehog.Main          (defaultMain)
 import qualified Hedgehog.Range         as Range
 
+import qualified Integer
+import qualified Word32
+import qualified Word64
+
 main :: IO ()
 main = do
 		recheck (Size 4) (Seed 14462958355020818941 14776761114051845121) prop_generatesUniqueValues
 		recheck (Size 8) (Seed 11763301661976410488 14055395789257366631) prop_generatesUniqueValues
 		recheck (Size 14) (Seed 6771904241892528611 8532317410904456029) prop_generatesUniqueValues
 		recheck (Size 14) (Seed 4790609826115340731 8375105224114527375) prop_generatesUniqueValues
-		defaultMain [ checkParallel $$(discover) ]
-
-genWord8 :: (MonadGen m) => m Word8
-genWord8 = Gen.word8 $ Range.linear (minBound @Word8) (maxBound @Word8)
-
-genWord256 :: (MonadGen m) => m Word256
-genWord256 = Gen.integral $ Range.linear (minBound @Word256) (maxBound @Word256)
-
-genConfig :: (MonadGen m) => m SnowcheckedConfig
-genConfig = SnowcheckedConfig
-		<$> Gen.integral (Range.linear 2 (maxBound @Word8))
-		<*> Gen.integral (Range.linear 2 (maxBound @Word8))
-		<*> Gen.integral (Range.linear 2 (maxBound @Word8))
-		<*> Gen.integral (Range.linear 2 (maxBound @Word8))
-
-forAllFlake :: (MonadIO m) => PropertyT m Flake
-forAllFlake = forAll genConfig >>= forAllFlake'
-
-forAllFlake' :: (MonadIO m) => SnowcheckedConfig -> PropertyT m Flake
-forAllFlake' cfg = do
-	nodeId <- forAll genWord256
-	newSnowcheckedGen cfg nodeId >>= nextFlake
+		defaultMain
+			[ checkParallel $$(discover)
+			, Integer.tests
+			, Word32.tests
+			, Word64.tests
+			]
 
 prop_generatesUniqueValues :: Property
 prop_generatesUniqueValues = property $ do
@@ -51,13 +40,6 @@
 	flakeGen <- newSnowcheckedGen cfg nodeId
 	resultLst <- mapM (\_ -> nextFlake flakeGen) lst
 	resultLst === nub resultLst
-
-prop_roundTripIntegral :: Property
-prop_roundTripIntegral = property $ do
-	cfg <- forAll genConfig
-	flake <- forAllFlake' cfg
-	result <- parseFlake cfg $ flakeToIntegral @Integer flake
-	flake === result
 
 prop_flakeCanBeNFed :: Property
 prop_flakeCanBeNFed = property $ do
diff --git a/test/Word32.hs b/test/Word32.hs
new file mode 100644
--- /dev/null
+++ b/test/Word32.hs
@@ -0,0 +1,23 @@
+{-# LANGUAGE TemplateHaskell  #-}
+{-# LANGUAGE TypeApplications #-}
+
+module Word32 (tests) where
+
+import           Control.Monad
+import           Data.Snowchecked
+import           Data.Snowchecked.Encoding.Integral
+import           Data.Word
+import           Gens
+import           Hedgehog
+
+tests :: IO Bool
+tests = checkParallel $$(discover)
+
+prop_flakeToWord32ToFlake :: Property
+prop_flakeToWord32ToFlake = withDiscards (999999999 :: DiscardLimit) . property $ do
+		cfg <- forAll genConfig
+		unless (snowcheckedConfigBitCount cfg <= 32) discard
+		flake <- forAllFlake' cfg
+		let value = fromFlake @Word32 flake
+		let result = parseFlake cfg value
+		result === Just flake
diff --git a/test/Word64.hs b/test/Word64.hs
new file mode 100644
--- /dev/null
+++ b/test/Word64.hs
@@ -0,0 +1,23 @@
+{-# LANGUAGE TemplateHaskell  #-}
+{-# LANGUAGE TypeApplications #-}
+
+module Word64 (tests) where
+
+import           Control.Monad
+import           Data.Snowchecked
+import           Data.Snowchecked.Encoding.Integral
+import           Data.Word
+import           Gens
+import           Hedgehog
+
+tests :: IO Bool
+tests = checkParallel $$(discover)
+
+prop_flakeToWord64ToFlake :: Property
+prop_flakeToWord64ToFlake = withDiscards (999999999 :: DiscardLimit) . property $ do
+		cfg <- forAll genConfig
+		unless (snowcheckedConfigBitCount cfg <= 64) discard
+		flake <- forAllFlake' cfg
+		let value = fromFlake @Word64 flake
+		let result = parseFlake cfg value
+		result === Just flake
