diff --git a/demo/ints/Main.hs b/demo/ints/Main.hs
--- a/demo/ints/Main.hs
+++ b/demo/ints/Main.hs
@@ -6,8 +6,8 @@
 import qualified Data.IntSet                   as IntSet
 import qualified Data.PerfectHash.Construction as Construction
 import qualified Data.PerfectHash.Lookup       as Lookup
-import qualified Data.PerfectHash.TestUtils    as Exercise
 import qualified Data.Vector.Unboxed           as Vector
+import qualified Exercise
 
 
 valueCount = 250000
diff --git a/demo/strings/Main.hs b/demo/strings/Main.hs
--- a/demo/strings/Main.hs
+++ b/demo/strings/Main.hs
@@ -4,7 +4,7 @@
 
 import qualified Data.PerfectHash.Construction as Construction
 import qualified Data.PerfectHash.Lookup       as Lookup
-import qualified Data.PerfectHash.TestUtils    as Exercise
+import qualified Exercise
 
 
 enableDebug = False
diff --git a/perfect-hash-generator.cabal b/perfect-hash-generator.cabal
--- a/perfect-hash-generator.cabal
+++ b/perfect-hash-generator.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 3429fd1131c7e55998ad9391be6e8af0010ce07ec53e20ea840551bc47a942ac
+-- hash: df669bc3ba741914da19be7e67c73565365e07ef3a7f13c93f2d9c51330f48bb
 
 name:           perfect-hash-generator
-version:        0.2.0.4
+version:        0.2.0.5
 synopsis:       Perfect minimal hashing implementation in native Haskell
 description:     A <https://en.wikipedia.org/wiki/Perfect_hash_function perfect hash function> for a set @S@ is a hash function that maps distinct elements in @S@ to a set of integers, with __no collisions__. A <https://en.wikipedia.org/wiki/Perfect_hash_function#Minimal_perfect_hash_function minimal perfect hash function> is a perfect hash function that maps @n@ keys to @n@ __consecutive__ integers, e.g. the numbers from @0@ to @n-1@.
                 .
@@ -70,7 +70,6 @@
       Data.PerfectHash.Construction
       Data.PerfectHash.Hashing
       Data.PerfectHash.Lookup
-      Data.PerfectHash.TestUtils
   other-modules:
       Paths_perfect_hash_generator
   default-language: Haskell2010
@@ -79,6 +78,7 @@
   main-is: Main.hs
   hs-source-dirs:
       demo/ints
+      test-utils
   ghc-options: -fwarn-tabs -W
   build-depends:
       base >=4.5 && <5
@@ -93,6 +93,7 @@
     , unordered-containers
     , vector
   other-modules:
+      Exercise
       Paths_perfect_hash_generator
   default-language: Haskell2010
 
@@ -100,6 +101,7 @@
   main-is: Main.hs
   hs-source-dirs:
       demo/strings
+      test-utils
   ghc-options: -fwarn-tabs -W
   build-depends:
       base >=4.5 && <5
@@ -113,6 +115,7 @@
     , unordered-containers
     , vector
   other-modules:
+      Exercise
       Paths_perfect_hash_generator
   default-language: Haskell2010
 
@@ -121,6 +124,7 @@
   main-is: Main.hs
   hs-source-dirs:
       test
+      test-utils
   ghc-options: -fwarn-tabs -W
   build-depends:
       HUnit
@@ -136,5 +140,6 @@
     , unordered-containers
     , vector
   other-modules:
+      Exercise
       Paths_perfect_hash_generator
   default-language: Haskell2010
diff --git a/src/Data/PerfectHash/TestUtils.hs b/src/Data/PerfectHash/TestUtils.hs
deleted file mode 100644
--- a/src/Data/PerfectHash/TestUtils.hs
+++ /dev/null
@@ -1,46 +0,0 @@
--- | This module is not used by the main library for constructing perfect hashes;
--- it just provides convenience functions for use by the tests and demonstration executables.
-module Data.PerfectHash.TestUtils where
-
-import           Control.Monad            (unless)
-import           Data.Foldable            (traverse_)
-import qualified Data.Vector.Unboxed      as Vector
-
-import qualified Data.PerfectHash.Hashing as Hashing
-import qualified Data.PerfectHash.Lookup  as Lookup
-
-
-testLookups :: (Show b, Eq b, Show a, Hashing.ToHashableChunks a, Vector.Unbox b) =>
-     Lookup.LookupTable b
-  -> [(a, b)]
-  -> Either String ()
-testLookups lookup_table =
-  traverse_ check_entry
-  where
-    check_entry (word, source_index) = unless (lookup_result == source_index) $
-      Left $ unwords [
-          "Result for key"
-        , show word
-        , "had incorrect index"
-        , show lookup_result
-        , "; should have been"
-        , show source_index
-        ]
-      where
-        lookup_result = Lookup.lookupPerfect lookup_table word
-
-
--- | Generate a map of words from a file to their line numbers.
---
--- Intended for use with @\"/usr/share/dict/words\"@.
-wordsFromFile :: FilePath -> IO [(String, Int)]
-wordsFromFile path = do
-  file_lines <- readFile path
-  let word_index_tuples = zip (lines file_lines) [1..]
-  return word_index_tuples
-
-
-eitherExit :: Either String b -> IO ()
-eitherExit x = case x of
-  Left err -> error err
-  Right _ -> return ()
diff --git a/test-utils/Exercise.hs b/test-utils/Exercise.hs
new file mode 100644
--- /dev/null
+++ b/test-utils/Exercise.hs
@@ -0,0 +1,46 @@
+-- | This module is not used by the main library for constructing perfect hashes;
+-- it just provides convenience functions for use by the tests and demonstration executables.
+module Exercise where
+
+import           Control.Monad            (unless)
+import           Data.Foldable            (traverse_)
+import qualified Data.Vector.Unboxed      as Vector
+
+import qualified Data.PerfectHash.Hashing as Hashing
+import qualified Data.PerfectHash.Lookup  as Lookup
+
+
+testLookups :: (Show b, Eq b, Show a, Hashing.ToHashableChunks a, Vector.Unbox b) =>
+     Lookup.LookupTable b
+  -> [(a, b)]
+  -> Either String ()
+testLookups lookup_table =
+  traverse_ check_entry
+  where
+    check_entry (word, source_index) = unless (lookup_result == source_index) $
+      Left $ unwords [
+          "Result for key"
+        , show word
+        , "had incorrect index"
+        , show lookup_result
+        , "; should have been"
+        , show source_index
+        ]
+      where
+        lookup_result = Lookup.lookupPerfect lookup_table word
+
+
+-- | Generate a map of words from a file to their line numbers.
+--
+-- Intended for use with @\"/usr/share/dict/words\"@.
+wordsFromFile :: FilePath -> IO [(String, Int)]
+wordsFromFile path = do
+  file_lines <- readFile path
+  let word_index_tuples = zip (lines file_lines) [1..]
+  return word_index_tuples
+
+
+eitherExit :: Either String b -> IO ()
+eitherExit x = case x of
+  Left err -> error err
+  Right _ -> return ()
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -12,7 +12,7 @@
 
 import qualified Data.PerfectHash.Construction  as Construction
 import qualified Data.PerfectHash.Hashing       as Hashing
-import qualified Data.PerfectHash.TestUtils     as Exercise
+import qualified Exercise
 
 
 testHashComputation :: (Hashing.ToHashableChunks a, Show a) =>
