diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2011-2015 Simon Hengel <sol@typeful.net>
+Copyright (c) 2011-2017 Simon Hengel <sol@typeful.net>
 Copyright (c) 2011-2012 Trystan Spangler <trystan.s@comcast.net>
 Copyright (c) 2011-2011 Greg Weber <greg@gregweber.info>
 
diff --git a/hspec-discover.cabal b/hspec-discover.cabal
--- a/hspec-discover.cabal
+++ b/hspec-discover.cabal
@@ -3,10 +3,10 @@
 -- see: https://github.com/sol/hpack
 
 name:             hspec-discover
-version:          2.3.2
+version:          2.4.0
 license:          MIT
 license-file:     LICENSE
-copyright:        (c) 2012-2015 Simon Hengel
+copyright:        (c) 2012-2017 Simon Hengel
 author:           Simon Hengel <sol@typeful.net>
 maintainer:       Simon Hengel <sol@typeful.net>
 build-type:       Simple
@@ -64,9 +64,9 @@
       test
   main-is: Spec.hs
   other-modules:
-      ConfigSpec
       Helper
-      RunSpec
+      Test.Hspec.Discover.ConfigSpec
+      Test.Hspec.Discover.RunSpec
   build-depends:
       base == 4.*
     , filepath
diff --git a/test/ConfigSpec.hs b/test/ConfigSpec.hs
deleted file mode 100644
--- a/test/ConfigSpec.hs
+++ /dev/null
@@ -1,47 +0,0 @@
-module ConfigSpec (main, spec) where
-
-import           Helper
-
-import           Test.Hspec.Discover.Config
-
-main :: IO ()
-main = hspec spec
-
-spec :: Spec
-spec = do
-  describe "parseConfig" $ do
-    let parse = parseConfig "hspec-discover"
-
-    it "recognizes --nested" $ do
-      parse ["--nested"] `shouldBe` Right (defaultConfig {configNested = True})
-
-    it "recognizes --formatter" $ do
-      parse ["--formatter", "someFormatter"] `shouldBe` Right (defaultConfig {configFormatter = Just "someFormatter"})
-
-    it "recognizes --no-main" $ do
-      parse ["--no-main"] `shouldBe` Right (defaultConfig {configNoMain = True})
-
-    it "returns error message on unrecognized option" $ do
-      parse ["--foo"] `shouldBe` (Left . unlines) [
-          "hspec-discover: unrecognized option `--foo'"
-        , ""
-        , "Usage: hspec-discover SRC CUR DST [--module-name=NAME]"
-        ]
-
-    it "returns error message on unexpected argument" $ do
-      parse ["foo"]   `shouldBe` (Left . unlines) [
-          "hspec-discover: unexpected argument `foo'"
-        , ""
-        , "Usage: hspec-discover SRC CUR DST [--module-name=NAME]"
-        ]
-
-    it "returns error message on --formatter=<fmt> with --no-main" $ do
-      parse ["--no-main", "--formatter=foo"] `shouldBe` (Left . unlines) [
-          "hspec-discover: option `--formatter=<fmt>' does not make sense with `--no-main'"
-        , ""
-        , "Usage: hspec-discover SRC CUR DST [--module-name=NAME]"
-        ]
-
-    context "when option is given multiple times" $ do
-      it "gives the last occurrence precedence" $ do
-        parse ["--formatter", "foo", "--formatter", "bar"] `shouldBe` Right (defaultConfig {configFormatter = Just "bar"})
diff --git a/test/RunSpec.hs b/test/RunSpec.hs
deleted file mode 100644
--- a/test/RunSpec.hs
+++ /dev/null
@@ -1,126 +0,0 @@
-module RunSpec (main, spec) where
-
-import           Helper
-
-import           System.IO
-import           System.Directory
-import           System.FilePath
-import           Data.List (sort)
-
-import           Test.Hspec.Discover.Run hiding (Spec)
-import qualified Test.Hspec.Discover.Run
-
-main :: IO ()
-main = hspec spec
-
-withTempFile :: (FilePath -> IO a) -> IO a
-withTempFile action = do
-  dir <- getTemporaryDirectory
-  (file, h) <- openTempFile dir ""
-  hClose h
-  action file <* removeFile file
-
-
-spec :: Spec
-spec = do
-  describe "run" $ do
-    it "generates test driver" $ withTempFile $ \f -> do
-      run ["test-data/nested-spec/Spec.hs", "", f]
-      readFile f `shouldReturn` unlines [
-          "{-# LINE 1 \"test-data/nested-spec/Spec.hs\" #-}"
-        , "{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}"
-        , "module Main where"
-        , "import qualified Foo.Bar.BazSpec"
-        , "import qualified Foo.BarSpec"
-        , "import qualified FooSpec"
-        , "import Test.Hspec.Discover"
-        , "main :: IO ()"
-        , "main = hspec spec"
-        , "spec :: Spec"
-        , "spec = " ++ unwords [
-               "postProcessSpec \"test-data/nested-spec/Foo/Bar/BazSpec.hs\" (describe \"Foo.Bar.Baz\" Foo.Bar.BazSpec.spec)"
-          , ">> postProcessSpec \"test-data/nested-spec/Foo/BarSpec.hs\" (describe \"Foo.Bar\" Foo.BarSpec.spec)"
-          , ">> postProcessSpec \"test-data/nested-spec/FooSpec.hs\" (describe \"Foo\" FooSpec.spec)"
-          ]
-        ]
-
-    it "generates test driver for an empty directory" $ withTempFile $ \f -> do
-      run ["test-data/empty-dir/Spec.hs", "", f]
-      readFile f `shouldReturn` unlines [
-          "{-# LINE 1 \"test-data/empty-dir/Spec.hs\" #-}"
-        , "{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}"
-        , "module Main where"
-        , "import Test.Hspec.Discover"
-        , "main :: IO ()"
-        , "main = hspec spec"
-        , "spec :: Spec"
-        , "spec = return ()"
-        ]
-
-  describe "pathToModule" $ do
-    it "derives module name from a given path" $ do
-      pathToModule "test/Spec.hs" `shouldBe` "Spec"
-
-  describe "getFilesRecursive" $ do
-    it "recursively returns all file entries of a given directory" $ do
-      getFilesRecursive "test-data" `shouldReturn` sort [
-          "empty-dir/Foo/Bar/Baz/.placeholder"
-        , "nested-spec/Foo/Bar/BazSpec.hs"
-        , "nested-spec/Foo/BarSpec.hs"
-        , "nested-spec/FooSpec.hs"
-        ]
-
-  describe "fileToSpec" $ do
-    it "converts path to spec name" $ do
-      fileToSpec "" "FooSpec.hs" `shouldBe` Just (spec_ "FooSpec.hs" "Foo")
-
-    it "rejects spec with empty name" $ do
-      fileToSpec "" "Spec.hs" `shouldBe` Nothing
-
-    it "works for lhs files" $ do
-      fileToSpec "" "FooSpec.lhs" `shouldBe` Just (spec_ "FooSpec.lhs" "Foo")
-
-    it "returns Nothing for invalid spec name" $ do
-      fileToSpec "" "foo" `shouldBe` Nothing
-
-    context "when spec does not have a valid module name" $ do
-      it "returns Nothing" $ do
-        fileToSpec "" "flycheck_Spec.hs" `shouldBe` Nothing
-
-    context "when any component of a hierarchical module name is not valid"$ do
-      it "returns Nothing" $ do
-        fileToSpec "" ("Valid" </> "invalid"  </>"MiddleNamesSpec.hs") `shouldBe` Nothing
-
-    context "when path has directory component" $ do
-      it "converts path to spec name" $ do
-        let file = "Foo" </> "Bar" </> "BazSpec.hs"
-        fileToSpec "" file `shouldBe` Just (spec_ file "Foo.Bar.Baz")
-
-      it "rejects spec with empty name" $ do
-        fileToSpec "" ("Foo" </> "Bar" </> "Spec.hs") `shouldBe` Nothing
-
-  describe "findSpecs" $ do
-    it "finds specs" $ do
-      let dir = "test-data/nested-spec"
-      findSpecs (dir </> "Spec.hs") `shouldReturn` [spec_ (dir </> "Foo/Bar/BazSpec.hs") "Foo.Bar.Baz", spec_ (dir </> "Foo/BarSpec.hs") "Foo.Bar", spec_ (dir </> "FooSpec.hs") "Foo"]
-
-  describe "driverWithFormatter" $ do
-    it "generates a test driver that uses a custom formatter" $ do
-      driverWithFormatter "Some.Module.formatter" "" `shouldBe` unlines [
-          "import qualified Some.Module"
-        , "main :: IO ()"
-        , "main = hspecWithFormatter Some.Module.formatter spec"
-        ]
-
-  describe "moduleNameFromId" $ do
-    it "returns the module name of a fully qualified identifier" $ do
-      moduleNameFromId "Some.Module.someId" `shouldBe` "Some.Module"
-
-  describe "importList" $ do
-    it "generates imports for a list of specs" $ do
-      importList [spec_ "FooSpec.hs" "Foo", spec_ "BarSpec.hs" "Bar"] "" `shouldBe` unlines [
-          "import qualified FooSpec"
-        , "import qualified BarSpec"
-        ]
-  where
-    spec_ = Test.Hspec.Discover.Run.Spec
diff --git a/test/Test/Hspec/Discover/ConfigSpec.hs b/test/Test/Hspec/Discover/ConfigSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Hspec/Discover/ConfigSpec.hs
@@ -0,0 +1,47 @@
+module Test.Hspec.Discover.ConfigSpec (main, spec) where
+
+import           Helper
+
+import           Test.Hspec.Discover.Config
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "parseConfig" $ do
+    let parse = parseConfig "hspec-discover"
+
+    it "recognizes --nested" $ do
+      parse ["--nested"] `shouldBe` Right (defaultConfig {configNested = True})
+
+    it "recognizes --formatter" $ do
+      parse ["--formatter", "someFormatter"] `shouldBe` Right (defaultConfig {configFormatter = Just "someFormatter"})
+
+    it "recognizes --no-main" $ do
+      parse ["--no-main"] `shouldBe` Right (defaultConfig {configNoMain = True})
+
+    it "returns error message on unrecognized option" $ do
+      parse ["--foo"] `shouldBe` (Left . unlines) [
+          "hspec-discover: unrecognized option `--foo'"
+        , ""
+        , "Usage: hspec-discover SRC CUR DST [--module-name=NAME]"
+        ]
+
+    it "returns error message on unexpected argument" $ do
+      parse ["foo"]   `shouldBe` (Left . unlines) [
+          "hspec-discover: unexpected argument `foo'"
+        , ""
+        , "Usage: hspec-discover SRC CUR DST [--module-name=NAME]"
+        ]
+
+    it "returns error message on --formatter=<fmt> with --no-main" $ do
+      parse ["--no-main", "--formatter=foo"] `shouldBe` (Left . unlines) [
+          "hspec-discover: option `--formatter=<fmt>' does not make sense with `--no-main'"
+        , ""
+        , "Usage: hspec-discover SRC CUR DST [--module-name=NAME]"
+        ]
+
+    context "when option is given multiple times" $ do
+      it "gives the last occurrence precedence" $ do
+        parse ["--formatter", "foo", "--formatter", "bar"] `shouldBe` Right (defaultConfig {configFormatter = Just "bar"})
diff --git a/test/Test/Hspec/Discover/RunSpec.hs b/test/Test/Hspec/Discover/RunSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Hspec/Discover/RunSpec.hs
@@ -0,0 +1,126 @@
+module Test.Hspec.Discover.RunSpec (main, spec) where
+
+import           Helper
+
+import           System.IO
+import           System.Directory
+import           System.FilePath
+import           Data.List (sort)
+
+import           Test.Hspec.Discover.Run hiding (Spec)
+import qualified Test.Hspec.Discover.Run
+
+main :: IO ()
+main = hspec spec
+
+withTempFile :: (FilePath -> IO a) -> IO a
+withTempFile action = do
+  dir <- getTemporaryDirectory
+  (file, h) <- openTempFile dir ""
+  hClose h
+  action file <* removeFile file
+
+
+spec :: Spec
+spec = do
+  describe "run" $ do
+    it "generates test driver" $ withTempFile $ \f -> do
+      run ["test-data/nested-spec/Spec.hs", "", f]
+      readFile f `shouldReturn` unlines [
+          "{-# LINE 1 \"test-data/nested-spec/Spec.hs\" #-}"
+        , "{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}"
+        , "module Main where"
+        , "import qualified Foo.Bar.BazSpec"
+        , "import qualified Foo.BarSpec"
+        , "import qualified FooSpec"
+        , "import Test.Hspec.Discover"
+        , "main :: IO ()"
+        , "main = hspec spec"
+        , "spec :: Spec"
+        , "spec = " ++ unwords [
+               "postProcessSpec \"test-data/nested-spec/Foo/Bar/BazSpec.hs\" (describe \"Foo.Bar.Baz\" Foo.Bar.BazSpec.spec)"
+          , ">> postProcessSpec \"test-data/nested-spec/Foo/BarSpec.hs\" (describe \"Foo.Bar\" Foo.BarSpec.spec)"
+          , ">> postProcessSpec \"test-data/nested-spec/FooSpec.hs\" (describe \"Foo\" FooSpec.spec)"
+          ]
+        ]
+
+    it "generates test driver for an empty directory" $ withTempFile $ \f -> do
+      run ["test-data/empty-dir/Spec.hs", "", f]
+      readFile f `shouldReturn` unlines [
+          "{-# LINE 1 \"test-data/empty-dir/Spec.hs\" #-}"
+        , "{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}"
+        , "module Main where"
+        , "import Test.Hspec.Discover"
+        , "main :: IO ()"
+        , "main = hspec spec"
+        , "spec :: Spec"
+        , "spec = return ()"
+        ]
+
+  describe "pathToModule" $ do
+    it "derives module name from a given path" $ do
+      pathToModule "test/Spec.hs" `shouldBe` "Spec"
+
+  describe "getFilesRecursive" $ do
+    it "recursively returns all file entries of a given directory" $ do
+      getFilesRecursive "test-data" `shouldReturn` sort [
+          "empty-dir/Foo/Bar/Baz/.placeholder"
+        , "nested-spec/Foo/Bar/BazSpec.hs"
+        , "nested-spec/Foo/BarSpec.hs"
+        , "nested-spec/FooSpec.hs"
+        ]
+
+  describe "fileToSpec" $ do
+    it "converts path to spec name" $ do
+      fileToSpec "" "FooSpec.hs" `shouldBe` Just (spec_ "FooSpec.hs" "Foo")
+
+    it "rejects spec with empty name" $ do
+      fileToSpec "" "Spec.hs" `shouldBe` Nothing
+
+    it "works for lhs files" $ do
+      fileToSpec "" "FooSpec.lhs" `shouldBe` Just (spec_ "FooSpec.lhs" "Foo")
+
+    it "returns Nothing for invalid spec name" $ do
+      fileToSpec "" "foo" `shouldBe` Nothing
+
+    context "when spec does not have a valid module name" $ do
+      it "returns Nothing" $ do
+        fileToSpec "" "flycheck_Spec.hs" `shouldBe` Nothing
+
+    context "when any component of a hierarchical module name is not valid"$ do
+      it "returns Nothing" $ do
+        fileToSpec "" ("Valid" </> "invalid"  </>"MiddleNamesSpec.hs") `shouldBe` Nothing
+
+    context "when path has directory component" $ do
+      it "converts path to spec name" $ do
+        let file = "Foo" </> "Bar" </> "BazSpec.hs"
+        fileToSpec "" file `shouldBe` Just (spec_ file "Foo.Bar.Baz")
+
+      it "rejects spec with empty name" $ do
+        fileToSpec "" ("Foo" </> "Bar" </> "Spec.hs") `shouldBe` Nothing
+
+  describe "findSpecs" $ do
+    it "finds specs" $ do
+      let dir = "test-data/nested-spec"
+      findSpecs (dir </> "Spec.hs") `shouldReturn` [spec_ (dir </> "Foo/Bar/BazSpec.hs") "Foo.Bar.Baz", spec_ (dir </> "Foo/BarSpec.hs") "Foo.Bar", spec_ (dir </> "FooSpec.hs") "Foo"]
+
+  describe "driverWithFormatter" $ do
+    it "generates a test driver that uses a custom formatter" $ do
+      driverWithFormatter "Some.Module.formatter" "" `shouldBe` unlines [
+          "import qualified Some.Module"
+        , "main :: IO ()"
+        , "main = hspecWithFormatter Some.Module.formatter spec"
+        ]
+
+  describe "moduleNameFromId" $ do
+    it "returns the module name of a fully qualified identifier" $ do
+      moduleNameFromId "Some.Module.someId" `shouldBe` "Some.Module"
+
+  describe "importList" $ do
+    it "generates imports for a list of specs" $ do
+      importList [spec_ "FooSpec.hs" "Foo", spec_ "BarSpec.hs" "Bar"] "" `shouldBe` unlines [
+          "import qualified FooSpec"
+        , "import qualified BarSpec"
+        ]
+  where
+    spec_ = Test.Hspec.Discover.Run.Spec
