diff --git a/shelly.cabal b/shelly.cabal
--- a/shelly.cabal
+++ b/shelly.cabal
@@ -1,6 +1,6 @@
 Name:       shelly
 
-Version:     1.5.6
+Version:     1.5.7
 Synopsis:    shell-like (systems) programming in Haskell
 
 Description: Shelly provides convenient systems programming in Haskell,
@@ -39,14 +39,14 @@
 
   Build-depends:
     containers                >= 0.4.2.0,
-    time                      >= 1.3 && < 1.5,
+    time                      >= 1.3 && < 1.6,
     directory                 >= 1.1.0.0 && < 1.3.0.0,
     mtl                       >= 2,
     process                   >= 1.0,
     unix-compat               < 0.5,
     system-filepath           >= 0.4.7 && < 0.5,
     system-fileio             < 0.4,
-    monad-control             >= 0.3.2 && < 0.4,
+    monad-control             >= 0.3.2 && < 1.1,
     lifted-base,
     lifted-async,
     exceptions                == 0.6.*,
diff --git a/src/Shelly.hs b/src/Shelly.hs
--- a/src/Shelly.hs
+++ b/src/Shelly.hs
@@ -604,7 +604,7 @@
                 L.find (S.member fp . snd) pathExecutables
 
 
-        pathDirs = mapM absPath =<< ((map FP.fromText . T.split (== searchPathSeparator)) `fmap` get_env_text "PATH")
+        pathDirs = mapM absPath =<< ((map FP.fromText . filter (not . T.null) . T.split (== searchPathSeparator)) `fmap` get_env_text "PATH")
 
         cachedPathExecutables :: Sh [(FilePath, S.Set FilePath)]
         cachedPathExecutables = do
@@ -863,7 +863,7 @@
 shellyNoDir = shelly' ReadOnlyState { rosFailToDir = False }
 {-# DEPRECATED shellyNoDir "Just use shelly. The default settings have changed" #-}
 
--- Using this entry point creates a @.shelly@ directory in the case
+-- | Using this entry point creates a @.shelly@ directory in the case
 -- of failure where errors are recorded.
 shellyFailDir :: MonadIO m => Sh a -> m a
 shellyFailDir = shelly' ReadOnlyState { rosFailToDir = True }
diff --git a/src/Shelly/Base.hs b/src/Shelly/Base.hs
--- a/src/Shelly/Base.hs
+++ b/src/Shelly/Base.hs
@@ -71,11 +71,19 @@
     liftBase = Sh . ReaderT . const
 
 instance MonadBaseControl IO Sh where
+#if MIN_VERSION_monad_control(1,0,0)
+    type StM Sh a = StM (ReaderT (IORef State) IO) a
+    liftBaseWith f =
+        Sh $ liftBaseWith $ \runInBase -> f $ \k ->
+            runInBase $ unSh k
+    restoreM = Sh . restoreM
+#else
     newtype StM Sh a = StMSh (StM (ReaderT (IORef State) IO) a)
     liftBaseWith f =
         Sh $ liftBaseWith $ \runInBase -> f $ \k ->
             liftM StMSh $ runInBase $ unSh k
     restoreM (StMSh m) = Sh . restoreM $ m
+#endif
 
 instance Catch.MonadThrow Sh where
   throwM = liftIO . Catch.throwM
diff --git a/src/Shelly/Pipe.hs b/src/Shelly/Pipe.hs
--- a/src/Shelly/Pipe.hs
+++ b/src/Shelly/Pipe.hs
@@ -138,6 +138,10 @@
     pure = return
     (<*>) = ap
 
+instance Alternative Sh where
+    empty = mzero
+    (<|>) = mplus
+
 instance MonadPlus Sh where
     mzero = Sh $ return []
     mplus a b = Sh $ liftA2 (++) (unSh a) (unSh b)
