diff --git a/hspec-discover.cabal b/hspec-discover.cabal
--- a/hspec-discover.cabal
+++ b/hspec-discover.cabal
@@ -1,9 +1,11 @@
--- This file has been generated from package.yaml by hpack version 0.18.0.
+-- This file has been generated from package.yaml by hpack version 0.21.2.
 --
 -- see: https://github.com/sol/hpack
+--
+-- hash: c1fbbc7305c5512cef66ad45b78b2a1fb3589239de3ff7fe0cfb89853a969622
 
 name:             hspec-discover
-version:          2.4.4
+version:          2.4.5
 license:          MIT
 license-file:     LICENSE
 copyright:        (c) 2012-2017 Simon Hengel
@@ -36,13 +38,14 @@
       src
   ghc-options: -Wall
   build-depends:
-      base == 4.*
-    , filepath
+      base ==4.*
     , directory
+    , filepath
   exposed: False
   exposed-modules:
       Test.Hspec.Discover.Config
       Test.Hspec.Discover.Run
+      Test.Hspec.Discover.Sort
   other-modules:
       Paths_hspec_discover
   default-language: Haskell2010
@@ -52,10 +55,12 @@
   hs-source-dirs:
       driver
   main-is: hspec-discover.hs
+  other-modules:
+      Paths_hspec_discover
   build-depends:
-      base == 4.*
-    , filepath
+      base ==4.*
     , directory
+    , filepath
     , hspec-discover
   default-language: Haskell2010
 
@@ -69,10 +74,13 @@
       Helper
       Test.Hspec.Discover.ConfigSpec
       Test.Hspec.Discover.RunSpec
+      Test.Hspec.Discover.SortSpec
+      Paths_hspec_discover
   build-depends:
-      base == 4.*
-    , filepath
+      QuickCheck >=2.7
+    , base ==4.*
     , directory
+    , filepath
     , hspec-discover
-    , hspec-meta >= 2.3.2
+    , hspec-meta >=2.3.2
   default-language: Haskell2010
diff --git a/src/Test/Hspec/Discover/Run.hs b/src/Test/Hspec/Discover/Run.hs
--- a/src/Test/Hspec/Discover/Run.hs
+++ b/src/Test/Hspec/Discover/Run.hs
@@ -30,6 +30,7 @@
 import           System.FilePath hiding (combine)
 
 import           Test.Hspec.Discover.Config
+import           Test.Hspec.Discover.Sort
 
 instance IsString ShowS where
   fromString = showString
@@ -141,7 +142,8 @@
 isValidModuleChar c = isAlphaNum c || c == '_' || c == '\''
 
 getFilesRecursive :: FilePath -> IO [FilePath]
-getFilesRecursive baseDir = sort <$> go []
+getFilesRecursive baseDir = sortNaturally <$> go []
+
   where
     go :: FilePath -> IO [FilePath]
     go dir = do
diff --git a/src/Test/Hspec/Discover/Sort.hs b/src/Test/Hspec/Discover/Sort.hs
new file mode 100644
--- /dev/null
+++ b/src/Test/Hspec/Discover/Sort.hs
@@ -0,0 +1,30 @@
+module Test.Hspec.Discover.Sort (
+  sortNaturally
+, NaturalSortKey
+, naturalSortKey
+) where
+
+import           Control.Arrow
+import           Data.Char
+import           Data.List
+import           Data.Ord
+
+sortNaturally :: [String] -> [String]
+sortNaturally = sortBy (comparing naturalSortKey)
+
+data NaturalSortKey = NaturalSortKey [Chunk]
+  deriving (Eq, Ord)
+
+data Chunk = Numeric Integer Int | Textual [(Char, Char)]
+  deriving (Eq, Ord)
+
+naturalSortKey :: String -> NaturalSortKey
+naturalSortKey = NaturalSortKey . chunks
+  where
+    chunks [] = []
+    chunks s@(c:_)
+      | isDigit c = Numeric (read num) (length num) : chunks afterNum
+      | otherwise = Textual (map (toLower &&& id) str) : chunks afterStr
+      where
+        (num, afterNum) = span  isDigit s
+        (str, afterStr) = break isDigit s
diff --git a/test/Test/Hspec/Discover/SortSpec.hs b/test/Test/Hspec/Discover/SortSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Hspec/Discover/SortSpec.hs
@@ -0,0 +1,83 @@
+module Test.Hspec.Discover.SortSpec (main, spec) where
+
+import           Helper
+import           Test.QuickCheck
+
+import           Test.Hspec.Discover.Sort
+
+main :: IO ()
+main = hspec spec
+
+shuffleAndSort :: [String] -> IO [String]
+shuffleAndSort xs = sortNaturally <$> generate (shuffle xs)
+
+spec :: Spec
+spec = do
+  describe "naturalSortKey" $ do
+    it "is injective" $ property $ \ a  b -> do
+      a /= b ==> naturalSortKey a /= naturalSortKey b
+
+  describe "sortNaturally" $ do
+    it "gives shorter strings precedence" $ do
+      let expected = [
+              ""
+            , "a"
+            , "aa"
+            ]
+      shuffleAndSort expected `shouldReturn` expected
+
+    it "gives numbers precedence" $ do
+      let expected = [
+              "Hello2World"
+            , "Hello World"
+            ]
+      shuffleAndSort expected `shouldReturn` expected
+
+    it "sorts numbers in ascending order" $ do
+      let expected = [
+              "Spec9.hs"
+            , "Spec10.hs"
+            ]
+      shuffleAndSort expected `shouldReturn` expected
+
+    it "breaks numeric ties by string length" $ do
+      let expected = [
+              "Hello 2 World"
+            , "Hello 02 World"
+            ]
+      shuffleAndSort expected `shouldReturn` expected
+
+    it "given upper-case letters precedence over lower-case letters" $ do
+      let
+        expected = [
+            "AA.hs"
+          , "Aa.hs"
+          , "aA.hs"
+          , "aa.hs"
+          , "B.hs"
+          , "b.hs"
+          ]
+      shuffleAndSort expected `shouldReturn` expected
+
+    it "sorts number separated strings" $ do
+      let expected = [
+              "Hello2World9"
+            , "Hello2World!0"
+            ]
+      shuffleAndSort expected `shouldReturn` expected
+
+    it "sorts string separated numbers" $ do
+      let expected = [
+              "3.1.415"
+            , "3.14.15"
+            ]
+      shuffleAndSort expected `shouldReturn` expected
+
+    it "groups common string prefixes together" $ do
+      let expected = [
+              "SpecFoo.hs"
+            , "SpecFoo.lhs"
+            , "Specfoo.hs"
+            , "Specfoo.lhs"
+            ]
+      shuffleAndSort expected `shouldReturn` expected
