diff --git a/shelly.cabal b/shelly.cabal
--- a/shelly.cabal
+++ b/shelly.cabal
@@ -1,6 +1,6 @@
 Name:       shelly
 
-Version:     1.7.1
+Version:     1.7.2
 Synopsis:    shell-like (systems) programming in Haskell
 
 Description: Shelly provides convenient systems programming in Haskell,
@@ -133,7 +133,8 @@
     time                      >= 1.3 && < 1.9,
     mtl                       >= 2,
     HUnit                     >= 1.2,
-    hspec                     >= 1.5,
+    hspec                     >= 2.0,
+    hspec-contrib,
     transformers,
     transformers-base,
     filepath,
diff --git a/src/Shelly.hs b/src/Shelly.hs
--- a/src/Shelly.hs
+++ b/src/Shelly.hs
@@ -103,7 +103,7 @@
 #else
 import Prelude hiding ( readFile, FilePath)
 #endif
-import Data.Char ( isAlphaNum, isSpace )
+import Data.Char ( isAlphaNum, isSpace, toLower )
 import Data.Typeable
 import Data.IORef
 import Data.Sequence (Seq, (|>))
@@ -744,7 +744,8 @@
 setenvRaw :: Text -> Text -> Sh ()
 setenvRaw k v = modify $ \x -> x { sEnvironment = wibble $ sEnvironment x }
   where
-    (kStr, vStr) = (T.unpack k, T.unpack v)
+    normK = normalizeEnvVarNameText k
+    (kStr, vStr) = (T.unpack normK, T.unpack v)
     wibble environment = (kStr, vStr) : filter ((/=kStr) . fst) environment
 
 setPath :: Text -> Sh ()
@@ -753,7 +754,7 @@
   setenvRaw path_env newPath
 
 path_env :: Text
-path_env = "PATH"
+path_env = normalizeEnvVarNameText "PATH"
 
 -- | add the filepath onto the PATH env variable
 appendToPath :: FilePath -> Sh ()
@@ -778,14 +779,40 @@
 get_env_all :: Sh [(String, String)]
 get_env_all = gets sEnvironment
 
+-- On Windows, normalize all environment variable names (to lowercase)
+-- to account for case insensitivity.
+#if defined(mingw32_HOST_OS)
+
+normalizeEnvVarNameText :: Text -> Text
+normalizeEnvVarNameText = T.toLower
+
+normalizeEnvVarNameString :: String -> String
+normalizeEnvVarNameString = fmap toLower
+
+-- On other systems, keep the variable names as-is.
+#else
+
+normalizeEnvVarNameText :: Text -> Text
+normalizeEnvVarNameText = id
+
+normalizeEnvVarNameString :: String -> String
+normalizeEnvVarNameString = id
+
+#endif
+
 -- | Fetch the current value of an environment variable.
 -- if non-existant or empty text, will be Nothing
 get_env :: Text -> Sh (Maybe Text)
 get_env k = do
-  mval <- return . fmap T.pack . lookup (T.unpack k) =<< gets sEnvironment
+  mval <- return
+          . fmap T.pack
+          . lookup (T.unpack normK)
+          =<< gets sEnvironment
   return $ case mval of
     Nothing  -> Nothing
     Just val -> if (not $ T.null val) then Just val else Nothing
+  where
+  normK = normalizeEnvVarNameText k
 
 -- | deprecated
 getenv :: Text -> Sh Text
@@ -946,6 +973,17 @@
 shellyFailDir :: MonadIO m => Sh a -> m a
 shellyFailDir = shelly' ReadOnlyState { rosFailToDir = True }
 
+getNormalizedEnvironment :: IO [(String, String)]
+getNormalizedEnvironment =
+#if defined(mingw32_HOST_OS)
+  -- On Windows, normalize all environment variable names (to lowercase)
+  -- to account for case insensitivity.
+  fmap (\(a, b) -> (normalizeEnvVarNameString a, b)) <$> getEnvironment
+#else
+  -- On other systems, keep the environment as-is.
+  getEnvironment
+#endif
+
 -- | Enter a Sh from (Monad)IO. The environment and working directories are
 -- inherited from the current process-wide values. Any subsequent changes in
 -- processwide working directory or environment are not reflected in the
@@ -955,7 +993,7 @@
 
 shelly' :: MonadIO m => ReadOnlyState -> Sh a -> m a
 shelly' ros action = do
-  environment <- liftIO getEnvironment
+  environment <- liftIO getNormalizedEnvironment
   dir <- liftIO getWorkingDirectory
   let def  = State { sCode = 0
                    , sStdin = Nothing
diff --git a/test/src/EnvSpec.hs b/test/src/EnvSpec.hs
--- a/test/src/EnvSpec.hs
+++ b/test/src/EnvSpec.hs
@@ -33,4 +33,7 @@
         get_env_text "SHELLY"
       assert $ res == "test"
  
-
+  describe "get_env \"PATH\" (OS compatibility test)" $ do
+    it "get_env" $ do
+      res <- shelly $ get_env "PATH"
+      assert $ isJust res
diff --git a/test/src/LiftedSpec.hs b/test/src/LiftedSpec.hs
--- a/test/src/LiftedSpec.hs
+++ b/test/src/LiftedSpec.hs
@@ -7,7 +7,7 @@
 import Shelly.Lifted
 import Control.Concurrent.Async.Lifted
 import Control.Monad.Trans.Maybe
-import Test.Hspec.HUnit ()
+import Test.Hspec.Contrib.HUnit ()
 
 liftedSpec :: Spec
 liftedSpec =
diff --git a/test/src/TestInit.hs b/test/src/TestInit.hs
--- a/test/src/TestInit.hs
+++ b/test/src/TestInit.hs
@@ -1,10 +1,10 @@
 module TestInit (module Export) where
 
-import Test.HUnit as Export hiding (path) 
+import Test.HUnit as Export hiding (path)
 import Test.Hspec as Export
 #ifdef LIFTED
 import Shelly.Lifted as Export
 #else
 import Shelly as Export
 #endif
-import Test.Hspec.HUnit ()
+import Test.Hspec.Contrib.HUnit ()
