diff --git a/hspec.cabal b/hspec.cabal
--- a/hspec.cabal
+++ b/hspec.cabal
@@ -1,5 +1,5 @@
 name:             hspec
-version:          1.8.2
+version:          1.8.3
 license:          MIT
 license-file:     LICENSE
 copyright:        (c) 2011-2014 Simon Hengel,
diff --git a/src/Test/Hspec/Compat.hs b/src/Test/Hspec/Compat.hs
--- a/src/Test/Hspec/Compat.hs
+++ b/src/Test/Hspec/Compat.hs
@@ -3,6 +3,7 @@
   showType
 , showFullType
 , readMaybe
+, lookupEnv
 , module Data.IORef
 #if !MIN_VERSION_base(4,6,0)
 , modifyIORef'
@@ -12,6 +13,7 @@
 import           Data.Typeable (Typeable, typeOf, typeRepTyCon)
 import           Text.Read
 import           Data.IORef
+import           System.Environment
 
 #if MIN_VERSION_base(4,4,0)
 import           Data.Typeable.Internal (tyConModule, tyConName)
@@ -19,7 +21,6 @@
 
 #if !MIN_VERSION_base(4,6,0)
 import qualified Text.ParserCombinators.ReadP as P
-import Prelude
 #endif
 
 #if !MIN_VERSION_base(4,6,0)
@@ -51,6 +52,13 @@
 readMaybe s = case readEither s of
                 Left _  -> Nothing
                 Right a -> Just a
+
+-- | Return the value of the environment variable @var@, or @Nothing@ if
+-- there is no such value.
+--
+-- For POSIX users, this is equivalent to 'System.Posix.Env.getEnv'.
+lookupEnv :: String -> IO (Maybe String)
+lookupEnv k = lookup k `fmap` getEnvironment
 #endif
 
 showType :: Typeable a => a -> String
diff --git a/src/Test/Hspec/Core/Type.hs b/src/Test/Hspec/Core/Type.hs
--- a/src/Test/Hspec/Core/Type.hs
+++ b/src/Test/Hspec/Core/Type.hs
@@ -27,6 +27,7 @@
 import           Data.List (isPrefixOf)
 import           Data.Maybe (fromMaybe)
 
+import           Test.Hspec.Compat
 import           Test.Hspec.Util
 import           Test.Hspec.Expectations
 import           Test.HUnit.Lang (HUnitFailure(..))
diff --git a/src/Test/Hspec/FailureReport.hs b/src/Test/Hspec/FailureReport.hs
--- a/src/Test/Hspec/FailureReport.hs
+++ b/src/Test/Hspec/FailureReport.hs
@@ -6,7 +6,8 @@
 
 import           System.IO
 import           System.SetEnv
-import           Test.Hspec.Util (Path, safeTry, readMaybe, getEnv)
+import           Test.Hspec.Compat
+import           Test.Hspec.Util (Path, safeTry)
 
 data FailureReport = FailureReport {
   failureReportSeed :: Integer
@@ -27,7 +28,7 @@
 
 readFailureReport :: IO (Maybe FailureReport)
 readFailureReport = do
-  mx <- getEnv "HSPEC_FAILURES"
+  mx <- lookupEnv "HSPEC_FAILURES"
   case mx >>= readMaybe of
     Nothing -> do
       hPutStrLn stderr "WARNING: Could not read environment variable HSPEC_FAILURES; `--rerun' is ignored!"
diff --git a/src/Test/Hspec/Options.hs b/src/Test/Hspec/Options.hs
--- a/src/Test/Hspec/Options.hs
+++ b/src/Test/Hspec/Options.hs
@@ -13,6 +13,7 @@
 import           System.Console.GetOpt
 import           Test.Hspec.Formatters
 
+import           Test.Hspec.Compat
 import           Test.Hspec.Util
 
 -- for Monad (Either e) when base < 4.3
diff --git a/src/Test/Hspec/Runner.hs b/src/Test/Hspec/Runner.hs
--- a/src/Test/Hspec/Runner.hs
+++ b/src/Test/Hspec/Runner.hs
@@ -23,7 +23,7 @@
 import           Data.Monoid
 import           Data.Maybe
 import           System.IO
-import           System.Environment
+import           System.Environment (getProgName, getArgs, withArgs)
 import           System.Exit
 import qualified Control.Exception as E
 
@@ -32,7 +32,8 @@
 import           System.Random (newStdGen)
 import           Control.Monad.IO.Class (liftIO)
 
-import           Test.Hspec.Util
+import           Test.Hspec.Compat (lookupEnv)
+import           Test.Hspec.Util (Path, stdGenToInteger)
 import           Test.Hspec.Core.Type
 import           Test.Hspec.Config
 import           Test.Hspec.Formatters
@@ -139,7 +140,7 @@
 
     doesUseColor :: Handle -> Config -> IO Bool
     doesUseColor h c = case configColorMode c of
-      ColorAuto  -> hIsTerminalDevice h
+      ColorAuto  -> (&&) <$> hIsTerminalDevice h <*> (not <$> isDumb)
       ColorNever -> return False
       ColorAlways -> return True
 
@@ -147,6 +148,9 @@
     withHandle c action = case configHandle c of
       Left h -> action h
       Right path -> withFile path WriteMode action
+
+isDumb :: IO Bool
+isDumb = maybe False (== "dumb") <$> lookupEnv "TERM"
 
 -- | Summary of a test run.
 data Summary = Summary {
diff --git a/src/Test/Hspec/Util.hs b/src/Test/Hspec/Util.hs
--- a/src/Test/Hspec/Util.hs
+++ b/src/Test/Hspec/Util.hs
@@ -5,8 +5,6 @@
 , Path
 , filterPredicate
 , formatRequirement
-, readMaybe
-, getEnv
 , strip
 , stdGenToInteger
 , stdGenFromInteger
@@ -14,11 +12,9 @@
 
 import           Data.Int (Int32)
 import           Data.List
-import           Data.Maybe
 import           Data.Char (isSpace)
 import           Control.Applicative
 import qualified Control.Exception as E
-import qualified System.Environment as Environment
 import           System.Random (StdGen)
 
 -- | Create a more readable display of a quantity of something.
@@ -76,14 +72,6 @@
     join xs = case xs of
       [x] -> x ++ " "
       ys  -> concatMap (++ ", ") ys
-
--- NOTE: base-4.6.0.0 provides a function with that name and type.  For
--- compatibility with earlier versions, we define our own version here.
-readMaybe :: Read a => String -> Maybe a
-readMaybe = fmap fst . listToMaybe . reads
-
-getEnv :: String -> IO (Maybe String)
-getEnv key = either (const Nothing) Just <$> safeTry (Environment.getEnv key)
 
 -- ensure that lines are not longer then given `n`, insert line breaks at word
 -- boundaries
diff --git a/test/Test/Hspec/CompatSpec.hs b/test/Test/Hspec/CompatSpec.hs
--- a/test/Test/Hspec/CompatSpec.hs
+++ b/test/Test/Hspec/CompatSpec.hs
@@ -2,6 +2,7 @@
 module Test.Hspec.CompatSpec (main, spec) where
 
 import           Helper
+import           System.SetEnv
 
 import           Test.Hspec.Compat
 import           Data.Typeable
@@ -21,3 +22,12 @@
   describe "showFullType (currently unused)" $ do
     it "shows fully qualified name of type" $ do
       showFullType SomeType `shouldBe` "Test.Hspec.CompatSpec.SomeType"
+
+  describe "lookupEnv" $ do
+    it "returns value of specified environment variable" $ do
+      setEnv "FOO" "bar"
+      lookupEnv "FOO" `shouldReturn` Just "bar"
+
+    it "returns Nothing if specified environment variable is not set" $ do
+      unsetEnv "FOO"
+      lookupEnv "FOO" `shouldReturn` Nothing
diff --git a/test/Test/Hspec/RunnerSpec.hs b/test/Test/Hspec/RunnerSpec.hs
--- a/test/Test/Hspec/RunnerSpec.hs
+++ b/test/Test/Hspec/RunnerSpec.hs
@@ -8,7 +8,7 @@
 import qualified Control.Exception as E
 import           Mock
 import           System.SetEnv
-import           Test.Hspec.Util (getEnv)
+import           Test.Hspec.Compat
 
 import           Test.Hspec.FailureReport (FailureReport(..))
 import qualified Test.Hspec as H
@@ -59,7 +59,7 @@
             H.it "example 2" False
         H.describe "baz" $ do
           H.it "example 3" False
-      getEnv "HSPEC_FAILURES" `shouldReturn` (Just . show) FailureReport {
+      lookupEnv "HSPEC_FAILURES" `shouldReturn` (Just . show) FailureReport {
           failureReportSeed = 23
         , failureReportMaxSuccess = 100
         , failureReportMaxSize = 100
diff --git a/test/Test/Hspec/UtilSpec.hs b/test/Test/Hspec/UtilSpec.hs
--- a/test/Test/Hspec/UtilSpec.hs
+++ b/test/Test/Hspec/UtilSpec.hs
@@ -5,7 +5,6 @@
 import           Data.Int (Int32)
 import           System.Random (StdGen)
 import qualified Control.Exception as E
-import           System.SetEnv
 
 import           Test.Hspec.Util
 
@@ -91,15 +90,6 @@
 
     it "properly handles context after a subject that consists of several components" $ do
       formatRequirement (["Data", "List", "reverse", "when applied twice"], "reverses a list") `shouldBe` "Data.List.reverse, when applied twice, reverses a list"
-
-  describe "getEnv" $ do
-    it "returns value of specified environment variable" $ do
-      setEnv "FOO" "bar"
-      getEnv "FOO" `shouldReturn` Just "bar"
-
-    it "returns Nothing if specified environment variable is not set" $ do
-      unsetEnv "FOO"
-      getEnv "FOO" `shouldReturn` Nothing
 
   describe "stdGenToInteger" $ do
     it "is inverse to stdGenFromInteger" $ property $
