diff --git a/shelly.cabal b/shelly.cabal
--- a/shelly.cabal
+++ b/shelly.cabal
@@ -1,6 +1,6 @@
 Name:       shelly
 
-Version:     1.3.0.6
+Version:     1.3.0.7
 Synopsis:    shell-like (systems) programming in Haskell
 
 Description: Shelly provides convenient systems programming in Haskell,
diff --git a/src/Shelly.hs b/src/Shelly.hs
--- a/src/Shelly.hs
+++ b/src/Shelly.hs
@@ -550,14 +550,13 @@
                       | otherwise                        = lookupCache
         checkFile = do
             exists <- liftIO $ isFile fp
-            return $ if exists then Just fp else Nothing
+            return $ toMaybe exists fp
 
         lookupPath =
-            pathDirs >>= findMapM (\dir -> do
+            (pathDirs >>=) $ findMapM $ \dir -> do
                 let fullFp = dir </> fp
                 res <- liftIO $ isExecutable $ encodeString $ fullFp
-                return $ if res then Just fullFp else Nothing
-              )
+                return $ toMaybe res fullFp
 
         lookupCache = do
             pathExecutables <- cachedPathExecutables
@@ -589,11 +588,15 @@
                 return $ cachedExecutables
 
 
+-- | Returns 'Just' if the precondition is fulfilled.
+toMaybe :: Bool -> a -> Maybe a
+toMaybe False _ = Nothing
+toMaybe True x = Just x
+
 -- | A monadic findMap, taken from MissingM package
 findMapM :: Monad m => (a -> m (Maybe b)) -> [a] -> m (Maybe b)
 findMapM _ [] = return Nothing
-findMapM f (x:xs) =
-  do
+findMapM f (x:xs) = do
     mb <- f x
     if (isJust mb)
       then return mb
@@ -652,16 +655,18 @@
 -- | Set an environment variable. The environment is maintained in Sh
 -- internally, and is passed to any external commands to be executed.
 setenv :: Text -> Text -> Sh ()
-setenv k v =
-  if k == path_env then setPath v else do
-      let (kStr, vStr) = (T.unpack k, T.unpack v)
-          wibble environment = (kStr, vStr) : filter ((/=kStr) . fst) environment
-       in modify $ \x -> x { sEnvironment = wibble $ sEnvironment x }
+setenv k v = if k == path_env then setPath v else setenvRaw k v
 
+setenvRaw :: Text -> Text -> Sh ()
+setenvRaw k v = modify $ \x -> x { sEnvironment = wibble $ sEnvironment x }
+  where
+    (kStr, vStr) = (T.unpack k, T.unpack v)
+    wibble environment = (kStr, vStr) : filter ((/=kStr) . fst) environment
+
 setPath :: Text -> Sh ()
 setPath newPath = do
   modify $ \x -> x{ sPathExecutables = Nothing }
-  setenv path_env newPath
+  setenvRaw path_env newPath
 
 path_env :: Text
 path_env = "PATH"
@@ -679,8 +684,8 @@
 get_env k = do
   mval <- return . fmap T.pack . lookup (T.unpack k) =<< gets sEnvironment
   return $ case mval of
-    Nothing -> Nothing
-    j@(Just val) -> if T.null val then Nothing else j
+    Nothing  -> Nothing
+    Just val -> toMaybe (not $ T.null val) val
 
 -- | deprecated
 getenv :: Text -> Sh Text
