diff --git a/approx-rand-test.cabal b/approx-rand-test.cabal
--- a/approx-rand-test.cabal
+++ b/approx-rand-test.cabal
@@ -1,5 +1,5 @@
 Name:          approx-rand-test
-Version:       0.0.3
+Version:       0.0.4
 License:       OtherLicense
 License-file:  LICENSE
 Copyright:     Copyright 2012 Daniël de Kok
@@ -19,7 +19,7 @@
 Source-Repository this
   Type:     git
   Location: git://github.com/danieldk/approx-rand-test.git
-  Tag:      0.0.3
+  Tag:      0.0.4
 
 Library
   HS-Source-Dirs:  src
@@ -28,16 +28,17 @@
   Build-Depends:   base >= 4 && < 5, vector == 0.9.*,
                    mersenne-random-pure64 == 0.2.0.*,
                    monad-mersenne-random == 0.1,
-                   mtl == 2.0.1.*, statistics == 0.10.1.*,
-                   transformers == 0.2.2.*
+                   mtl == 2.1.*, statistics == 0.10.1.*,
+                   transformers == 0.3.*
 
 
 Executable approx_rand_test
   Main-Is:        approx-rand-test.hs
+  Other-Modules:  SampleIO
   HS-Source-Dirs: utils
   Ghc-Options:    -O2 -Wall
   Build-Depends:  base >= 4 && < 5, approx-rand-test,
-                  conduit == 0.4.*, text == 0.11.1.*,
+                  conduit == 0.4.*, text == 0.11.2.*,
                   vector == 0.9.*,
                   mersenne-random-pure64 == 0.2.0.*,
                   monad-mersenne-random == 0.1,
@@ -47,14 +48,15 @@
 
 Executable approx_rand_test_paired
   Main-Is:        approx-rand-test-paired.hs
+  Other-Modules:  SampleIO
   HS-Source-Dirs: utils
   Ghc-Options:    -O2 -Wall
   Build-Depends:  base >= 4 && < 5, approx-rand-test,
-                  conduit == 0.4.*, text == 0.11.1.*,
+                  conduit == 0.4.*, text == 0.11.2.*,
                   vector == 0.9.*,
                   mersenne-random-pure64 == 0.2.0.*,
                   monad-mersenne-random == 0.1,
-                  mtl == 2.0.1.*, resourcet == 0.3.*,
+                  mtl == 2.1.*, resourcet == 0.3.*,
                   statistics == 0.10.1.*
 
 Test-Suite tests
diff --git a/utils/SampleIO.hs b/utils/SampleIO.hs
new file mode 100644
--- /dev/null
+++ b/utils/SampleIO.hs
@@ -0,0 +1,40 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+
+module SampleIO 
+(
+  readFileCol
+) where
+
+import           Control.Exception.Base (Exception)
+import           Control.Monad (liftM)
+import           Data.Conduit (($$), ($=)) 
+import qualified Data.Conduit as C
+import qualified Data.Conduit.Binary as CB
+import qualified Data.Conduit.List as CL
+import qualified Data.Conduit.Text as CT
+import qualified Data.Text as T
+import qualified Data.Text.Read as TR
+import           Data.Typeable (Typeable)
+
+data ReadException =
+  DoubleConversionException String
+  deriving (Show, Typeable)
+
+instance Exception ReadException
+
+readFileCol :: String -> Int -> IO [Double]
+readFileCol fn col =
+  liftM reverse $ C.runResourceT (
+    CB.sourceFile fn $=
+    CB.lines $=
+    CT.decode CT.utf8 $=
+    CL.map (T.split (== ' ')) $=
+    CL.map (!! col) $=
+    toDouble $$
+    CL.consume )
+
+toDouble :: C.MonadThrow m => C.Conduit T.Text m Double
+toDouble = CL.mapM $ \v ->
+  case TR.double v of
+    Left err     -> C.monadThrow $ DoubleConversionException err
+    Right (d, _) -> return d
diff --git a/utils/approx-rand-test-paired.hs b/utils/approx-rand-test-paired.hs
--- a/utils/approx-rand-test-paired.hs
+++ b/utils/approx-rand-test-paired.hs
@@ -7,22 +7,13 @@
 --
 -- Approximate randomization test (Noreen, 1989)
 
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE DoAndIfThenElse #-}
 
-import           Control.Exception.Base (Exception)
+module Main where
+
 import           Control.Monad (liftM, when)
 import           Control.Monad.Error (runErrorT)
 import           Control.Monad.Mersenne.Random (evalRandom)
-import           Data.Conduit (($$), ($=)) 
-import qualified Data.Conduit as C
-import qualified Data.Conduit.Binary as CB
-import qualified Data.Conduit.List as CL
-import qualified Data.Conduit.Text as CT
-import qualified Data.Text as T
-import qualified Data.Text.Read as TR
-import           Data.Typeable (Typeable)
 import qualified Data.Vector.Unboxed as V
 import           Data.Word (Word64)
 import           Statistics.Test.ApproxRand
@@ -34,28 +25,7 @@
 import           System.Random.Mersenne.Pure64 (PureMT, newPureMT, pureMT)
 import           Text.Printf (printf)
 
-data ReadException =
-  DoubleConversionException String
-  deriving (Show, Typeable)
-
-instance Exception ReadException
-
-readFileCol :: String -> Int -> IO [Double]
-readFileCol fn col =
-  liftM reverse $ C.runResourceT (
-    CB.sourceFile fn $=
-    CB.lines $=
-    CT.decode CT.utf8 $=
-    CL.map (T.split (== ' ')) $=
-    CL.map (!! col) $=
-    toDouble $$
-    CL.consume )
-
-toDouble :: C.MonadThrow m => C.Conduit T.Text m Double
-toDouble = CL.mapM $ \v ->
-  case TR.double v of
-    Left err     -> C.monadThrow $ DoubleConversionException err
-    Right (d, _) -> return d
+import           SampleIO
 
 main :: IO ()
 main = do
diff --git a/utils/approx-rand-test.hs b/utils/approx-rand-test.hs
--- a/utils/approx-rand-test.hs
+++ b/utils/approx-rand-test.hs
@@ -7,21 +7,12 @@
 --
 -- Approximate randomization test (Noreen, 1989)
 
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE DoAndIfThenElse #-}
 
-import           Control.Exception.Base (Exception)
+module Main where
+
 import           Control.Monad (liftM, when)
 import           Control.Monad.Mersenne.Random (evalRandom)
-import           Data.Conduit (($$), ($=)) 
-import qualified Data.Conduit as C
-import qualified Data.Conduit.Binary as CB
-import qualified Data.Conduit.List as CL
-import qualified Data.Conduit.Text as CT
-import qualified Data.Text as T
-import qualified Data.Text.Read as TR
-import           Data.Typeable (Typeable)
 import qualified Data.Vector.Unboxed as V
 import           Data.Word (Word64)
 import           Statistics.Test.ApproxRand
@@ -33,28 +24,7 @@
 import           System.Random.Mersenne.Pure64 (PureMT, newPureMT, pureMT)
 import           Text.Printf (printf)
 
-data ReadException =
-  DoubleConversionException String
-  deriving (Show, Typeable)
-
-instance Exception ReadException
-
-readFileCol :: String -> Int -> IO [Double]
-readFileCol fn col =
-  liftM reverse $ C.runResourceT (
-    CB.sourceFile fn $=
-    CB.lines $=
-    CT.decode CT.utf8 $=
-    CL.map (T.split (== ' ')) $=
-    CL.map (!! col) $=
-    toDouble $$
-    CL.consume )
-
-toDouble :: C.MonadThrow m => C.Conduit T.Text m Double
-toDouble = CL.mapM $ \v ->
-  case TR.double v of
-    Left err     -> C.monadThrow $ DoubleConversionException err
-    Right (d, _) -> return d
+import           SampleIO
 
 main :: IO ()
 main = do
