diff --git a/Cabal/tests/PackageTests.hs b/Cabal/tests/PackageTests.hs
index b2a599146ac5e756f6da786290556e36261ea8fb..fe6d890f3193f8c5fd9be7e61b23ce1bb7b7d437 100644
--- a/Cabal/tests/PackageTests.hs
+++ b/Cabal/tests/PackageTests.hs
@@ -77,13 +77,7 @@ tests version inplaceSpec ghcPath ghcPkgPath =
     , hunit "TestStanza" (PackageTests.TestStanza.Check.suite ghcPath)
       -- ^ The Test stanza test will eventually be required
       -- only for higher versions.
-    , hunit "TestSuiteExeV10/Test" (PackageTests.TestSuiteExeV10.Check.checkTest ghcPath)
-    , hunit "TestSuiteExeV10/TestWithHpc"
-      (PackageTests.TestSuiteExeV10.Check.checkTestWithHpc ghcPath)
-    , hunit "TestSuiteExeV10/TestWithoutHpcNoTix"
-      (PackageTests.TestSuiteExeV10.Check.checkTestWithoutHpcNoTix ghcPath)
-    , hunit "TestSuiteExeV10/TestWithoutHpcNoMarkup"
-      (PackageTests.TestSuiteExeV10.Check.checkTestWithoutHpcNoMarkup ghcPath)
+    , testGroup "TestSuiteExeV10" (PackageTests.TestSuiteExeV10.Check.checks ghcPath)
     , hunit "TestOptions" (PackageTests.TestOptions.Check.suite ghcPath)
     , hunit "BenchmarkStanza" (PackageTests.BenchmarkStanza.Check.suite ghcPath)
       -- ^ The benchmark stanza test will eventually be required
diff --git a/Cabal/tests/PackageTests/TestSuiteExeV10/Check.hs b/Cabal/tests/PackageTests/TestSuiteExeV10/Check.hs
index b6fd1c5216d11137a9780e14d750a9cdf87a708e..e140ff958357fa6b7bfb3cd70db5a71314bff36c 100644
--- a/Cabal/tests/PackageTests/TestSuiteExeV10/Check.hs
+++ b/Cabal/tests/PackageTests/TestSuiteExeV10/Check.hs
@@ -1,24 +1,47 @@
-module PackageTests.TestSuiteExeV10.Check
-       ( checkTest
-       , checkTestWithHpc
-       , checkTestWithoutHpcNoTix
-       , checkTestWithoutHpcNoMarkup
-       ) where
+module PackageTests.TestSuiteExeV10.Check (checks) where
+
+import System.Directory ( doesFileExist )
+import System.FilePath
+import qualified Test.Framework as TF
+import Test.Framework (testGroup)
+import Test.Framework.Providers.HUnit (hUnitTestToTests)
+import Test.HUnit hiding ( path )
 
-import Distribution.PackageDescription     ( TestSuite(..), emptyTestSuite )
-import Distribution.Version                ( Version(..), orLaterVersion )
 import Distribution.Simple.Hpc
-import Distribution.Simple.Program.Builtin ( hpcProgram )
-import Distribution.Simple.Program.Db      ( emptyProgramDb, configureProgram,
-                                             requireProgramVersion )
+
 import PackageTests.PackageTester
-import qualified Control.Exception as E    ( IOException, catch )
-import Control.Monad                       ( when )
-import System.Directory                    ( doesFileExist )
-import System.FilePath
-import Test.HUnit
 
-import qualified Distribution.Verbosity as Verbosity
+checks :: FilePath -> [TF.Test]
+checks ghcPath =
+    [ hunit "Test" $ checkTest ghcPath ]
+    ++ hpcTestMatrix ghcPath ++
+    [ hunit "TestWithoutHpc/NoTix" $ checkTestWithoutHpcNoTix ghcPath
+    , hunit "TestWithoutHpc/NoMarkup" $ checkTestWithoutHpcNoMarkup ghcPath
+    ]
+
+hpcTestMatrix :: FilePath -> [TF.Test]
+hpcTestMatrix ghcPath = do
+    libProf <- [True, False]
+    exeProf <- [True, False]
+    exeDyn <- [True, False]
+    shared <- [True, False]
+    let name = concat
+            [ "WithHpc/"
+            , if libProf then "LibProf" else ""
+            , if exeProf then "ExeProf" else ""
+            , if exeDyn then "ExeDyn" else ""
+            , if shared then "Shared" else ""
+            ]
+        enable cond flag
+          | cond = "--enable-" ++ flag
+          | otherwise = "--disable-" ++ flag
+        opts =
+            [ enable libProf "library-profiling"
+            , enable exeProf "executable-profiling"
+            , enable exeDyn "executable-dynamic"
+            , enable shared "shared"
+            ]
+    return $ hunit name $ checkTestWithHpc ghcPath opts
 
 dir :: FilePath
 dir = "PackageTests" </> "TestSuiteExeV10"
@@ -26,55 +49,40 @@ dir = "PackageTests" </> "TestSuiteExeV10"
 checkTest :: FilePath -> Test
 checkTest ghcPath = TestCase $ buildAndTest ghcPath [] []
 
+shouldExist :: FilePath -> Assertion
+shouldExist path = doesFileExist path >>= assertBool (path ++ " should exist")
+
+shouldNotExist :: FilePath -> Assertion
+shouldNotExist path =
+    doesFileExist path >>= assertBool (path ++ " should exist") . not
+
 -- | Ensure that both .tix file and markup are generated if coverage is enabled.
-checkTestWithHpc :: FilePath -> Test
-checkTestWithHpc ghcPath = TestCase $ do
-    isCorrectVersion <- correctHpcVersion
-    when isCorrectVersion $ do
-      buildAndTest ghcPath [] ["--enable-coverage"]
-      let dummy = emptyTestSuite { testName = "test-Foo" }
-          tixFile = tixFilePath (dir </> "dist") $ testName dummy
-          tixFileMessage = ".tix file should exist"
-          markupDir = htmlDir (dir </> "dist") $ testName dummy
-          markupFile = markupDir </> "hpc_index" <.> "html"
-          markupFileMessage = "HPC markup file should exist"
-      tixFileExists <- doesFileExist tixFile
-      assertEqual tixFileMessage True tixFileExists
-      markupFileExists <- doesFileExist markupFile
-      assertEqual markupFileMessage True markupFileExists
-  where
+checkTestWithHpc :: FilePath -> [String] -> Test
+checkTestWithHpc ghcPath extraOpts = TestCase $ do
+    buildAndTest ghcPath [] ("--enable-coverage" : extraOpts)
+    shouldExist $ mixDir (dir </> "dist") "my-0.1" </> "my-0.1" </> "Foo.mix"
+    shouldExist $ mixDir (dir </> "dist") "test-Foo" </> "Main.mix"
+    shouldExist $ tixFilePath (dir </> "dist") "test-Foo"
+    shouldExist $ htmlDir (dir </> "dist") "test-Foo" </> "hpc_index.html"
 
 -- | Ensures that even if -fhpc is manually provided no .tix file is output.
 checkTestWithoutHpcNoTix :: FilePath -> Test
 checkTestWithoutHpcNoTix ghcPath = TestCase $ do
-    isCorrectVersion <- correctHpcVersion
-    when isCorrectVersion $ do
-      buildAndTest ghcPath [] [ "--ghc-option=-fhpc"
-                              , "--ghc-option=-hpcdir"
-                              , "--ghc-option=dist/hpc" ]
-      let dummy = emptyTestSuite { testName = "test-Foo" }
-          tixFile = tixFilePath (dir </> "dist") $ testName dummy
-          tixFileMessage = ".tix file should NOT exist"
-      tixFileExists <- doesFileExist tixFile
-      assertEqual tixFileMessage False tixFileExists
+    buildAndTest ghcPath [] [ "--ghc-option=-fhpc"
+                            , "--ghc-option=-hpcdir"
+                            , "--ghc-option=dist/hpc" ]
+    shouldNotExist $ tixFilePath (dir </> "dist") "test-Foo"
 
 -- | Ensures that even if a .tix file happens to be left around
 -- markup isn't generated.
 checkTestWithoutHpcNoMarkup :: FilePath -> Test
 checkTestWithoutHpcNoMarkup ghcPath = TestCase $ do
-    isCorrectVersion <- correctHpcVersion
-    when isCorrectVersion $ do
-      let dummy = emptyTestSuite { testName = "test-Foo" }
-          tixFile = tixFilePath "dist" $ testName dummy
-          markupDir = htmlDir (dir </> "dist") $ testName dummy
-          markupFile = markupDir </> "hpc_index" <.> "html"
-          markupFileMessage = "HPC markup file should NOT exist"
-      buildAndTest ghcPath [("HPCTIXFILE", Just tixFile)]
-                           [ "--ghc-option=-fhpc"
-                           , "--ghc-option=-hpcdir"
-                           , "--ghc-option=dist/hpc" ]
-      markupFileExists <- doesFileExist markupFile
-      assertEqual markupFileMessage False markupFileExists
+    let tixFile = tixFilePath "dist" "test-Foo"
+    buildAndTest ghcPath [("HPCTIXFILE", Just tixFile)]
+                         [ "--ghc-option=-fhpc"
+                         , "--ghc-option=-hpcdir"
+                         , "--ghc-option=dist/hpc" ]
+    shouldNotExist $ htmlDir (dir </> "dist") "test-Foo" </> "hpc_index.html"
 
 -- | Build and test a package and ensure that both were successful.
 --
@@ -87,17 +95,5 @@ buildAndTest ghcPath envOverrides flags = do
     testResult <- cabal_test spec envOverrides [] ghcPath
     assertTestSucceeded testResult
 
--- | Checks for a suitable HPC version for testing.
-correctHpcVersion :: IO Bool
-correctHpcVersion = do
-    let programDb' = emptyProgramDb
-    let verbosity = Verbosity.normal
-    let verRange  = orLaterVersion (Version [0,7] [])
-    programDb <- configureProgram verbosity hpcProgram programDb'
-    (requireProgramVersion verbosity hpcProgram verRange programDb
-     >> return True) `catchIO` (\_ -> return False)
-  where
-    -- Distribution.Compat.Exception is hidden.
-    catchIO :: IO a -> (E.IOException -> IO a) -> IO a
-    catchIO = E.catch
-
+hunit :: TF.TestName -> Test -> TF.Test
+hunit name = testGroup name . hUnitTestToTests