diff --git a/RSA.cabal b/RSA.cabal
--- a/RSA.cabal
+++ b/RSA.cabal
@@ -1,6 +1,6 @@
 name:       RSA
 category:   Cryptography, Codec
-version:    1.0.4
+version:    1.0.5
 license:    BSD3
 license-file: LICENSE
 author:     Adam Wick <awick@galois.com>
@@ -29,15 +29,27 @@
 
 Flag QuickCheck1
   Description: Whether this is QuickCheck 1 or not
+  Default:     False
 
+Flag OldBase
+  Description: Whether or not to use base 3 (default: no)
+  Default: False
+
 Library
- build-depends: base >= 3 && < 5, bytestring, SHA, random
- GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans 
+ build-depends: bytestring, random
+ GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans
+ if flag(OldBase)
+   build-depends: base >= 3 && < 4, SHA < 1.4.1
+ else
+   build-depends: base >= 4 && < 5, SHA
  if flag(UseBinary)
    build-depends: binary
    CPP-Options: -DUSE_BINARY
  if flag(IncludeMD5) && flag(UseBinary)
-   build-depends: pureMD5
+   if flag(OldBase)
+      build-depends: pureMD5 < 1.1
+   else
+      build-depends: pureMD5
    CPP-Options: -DINCLUDE_MD5
  exposed-modules: Codec.Crypto.RSA
  extensions: CPP, BangPatterns, ScopedTypeVariables
@@ -46,12 +58,16 @@
   if flag(SkipTests)
     Buildable: False
   else
-    build-depends: base >= 3 && < 5, bytestring, SHA >= 1.0.1
+    if flag(OldBase)
+      build-depends: base >= 3 && < 4, SHA < 1.4.1
+    else
+      build-depends: base >= 4 && < 5, SHA
+    build-depends: bytestring, test-framework >= 0.3 && < 0.4
   if flag(QuickCheck1)
-    build-depends: QuickCheck < 2
+    build-depends: QuickCheck < 2, test-framework-quickcheck >= 0.2.6 && < 0.3
     CPP-Options:   -DQUICKCHECK1
   else
-    build-depends: QuickCheck >= 2 && < 3
+    build-depends: QuickCheck >= 2 && < 3, test-framework-quickcheck2 >= 0.2.7 && < 0.3
   GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans 
   CPP-Options: -DRSA_TEST
   Main-Is: Test.hs
diff --git a/Test.hs b/Test.hs
--- a/Test.hs
+++ b/Test.hs
@@ -4,10 +4,16 @@
 import qualified Data.ByteString.Lazy as BS
 import Data.Digest.Pure.SHA
 import Data.Word
-import System.IO
 import System.Random
 import Test.QuickCheck
 
+import Test.Framework (defaultMain, testGroup, Test)
+#ifdef QUICKCHECK1
+import Test.Framework.Providers.QuickCheck (testProperty)
+#else
+import Test.Framework.Providers.QuickCheck2 (testProperty)
+#endif
+
 -- --------------------------------------------------------------------------
 
 data KeyPair     = KP1K PublicKey PrivateKey
@@ -208,31 +214,36 @@
 
 -- --------------------------------------------------------------------------
 
-run_test :: Testable a => String -> a -> IO ()
-run_test n t = putStr ("  " ++ n ++ " ... ") >> hFlush stdout >> quickCheck t
-
 main :: IO ()
 main = do
-  g <- getStdGen
   putStrLn "\nWARNING WARNING WARNING"
   putStrLn "This test suite takes a very long time to run. If you're in a "
   putStrLn "hurry, Control-C is your friend."
-  putStrLn "WARNING WARNING WARNING"
-  putStrLn "\nTesting basic helper functions"
-  run_test "prop_chunkify_works"         prop_chunkify_works
-  run_test "prop_mod_exp_works"          prop_mod_exp_works
-  run_test "prop_mod_inv_works"          prop_mod_inv_works
-  putStrLn "\nTesting RSA core functions"
-  run_test "prop_i2o2i_identity"         prop_i2o2i_identity
-  run_test "prop_o2i2o_identity"         prop_o2i2o_identity
-  run_test "prop_ep_dp_identity"         prop_ep_dp_identity
-  run_test "prop_sp_vp_identity"         prop_sp_vp_identity
-  putStrLn "\nTesting fixed-width RSA padding functions:"
-  run_test "prop_oaep_inverts"           prop_oaep_inverts
-  run_test "prop_pkcs_inverts"         $ prop_pkcs_inverts         g
-  run_test "prop_sign_works"             prop_sign_works
-  putStrLn "\nTesting top-level functions work:"
-  run_test "prop_encrypt_inverts"      $ prop_encrypt_inverts      g
-  run_test "prop_encrypt_plus_inverts" $ prop_encrypt_plus_inverts g
+  putStrLn "WARNING WARNING WARNING\n"
 
+  g <- getStdGen
+  defaultMain $ tests g
 
+tests :: StdGen -> [Test]
+tests g = [
+  testGroup "Testing basic helper functions" [
+     testProperty "prop_chunkify_works"         prop_chunkify_works,
+     testProperty "prop_mod_exp_works"          prop_mod_exp_works,
+     testProperty "prop_mod_inv_works"          prop_mod_inv_works
+     ],
+  testGroup "Testing RSA core functions" [
+    testProperty "prop_i2o2i_identity"         prop_i2o2i_identity,
+    testProperty "prop_o2i2o_identity"         prop_o2i2o_identity,
+    testProperty "prop_ep_dp_identity"         prop_ep_dp_identity,
+    testProperty "prop_sp_vp_identity"         prop_sp_vp_identity
+    ],
+  testGroup "Testing fixed-width RSA padding functions" [
+    testProperty "prop_oaep_inverts"           prop_oaep_inverts,
+    testProperty "prop_pkcs_inverts"         $ prop_pkcs_inverts g,
+    testProperty "prop_sign_works"             prop_sign_works
+    ],
+  testGroup "Testing top-level functions" [
+    testProperty "prop_encrypt_inverts"      $ prop_encrypt_inverts      g,
+    testProperty "prop_encrypt_plus_inverts" $ prop_encrypt_plus_inverts g
+    ]
+  ]
