diff --git a/Shelly.hs b/Shelly.hs
--- a/Shelly.hs
+++ b/Shelly.hs
@@ -144,6 +144,7 @@
 class ShellArg a where toTextArg :: a -> Text
 instance ShellArg Text     where toTextArg = id
 instance ShellArg FilePath where toTextArg = toTextIgnore
+instance ShellArg String   where toTextArg = LT.pack
 
 
 -- Voodoo to create the variadic function 'cmd'
@@ -151,22 +152,22 @@
     cmdAll :: FilePath -> [Text] -> t
 
 instance ShellCommand (Sh Text) where
-    cmdAll fp args = run fp args
+    cmdAll = run
 
 instance (s ~ Text, Show s) => ShellCommand (Sh s) where
-    cmdAll fp args = run fp args
+    cmdAll = run
 
 -- note that Sh () actually doesn't work for its case (_<- cmd) when there is no type signature
 instance ShellCommand (Sh ()) where
-    cmdAll fp args = run_ fp args
+    cmdAll = run_
 
 instance (ShellArg arg, ShellCommand result) => ShellCommand (arg -> result) where
-    cmdAll fp acc = \x -> cmdAll fp (acc ++ [toTextArg x])
+    cmdAll fp acc x = cmdAll fp (acc ++ [toTextArg x])
 
 
 -- | variadic argument version of run.
 -- The syntax is more convenient, but more importantly it also allows the use of a FilePath as a command argument.
--- So an argument can be a Text or a FilePath.
+-- So an argument can be a Text or a FilePath without manual conversions.
 -- a FilePath is converted to Text with 'toTextIgnore'.
 -- You will need to add the following to your module:
 --
@@ -359,13 +360,22 @@
 pack :: String -> FilePath
 pack = decodeString
 
--- | Currently a 'rename' wrapper.
--- TODO: Support directory paths in the second parameter, like in 'cp'.
+-- | Move a file. The second path could be a directory, in which case the
+-- original file is moved into that directory.
+-- wraps system-fileio 'FileSystem.rename', which may not work across FS boundaries
 mv :: FilePath -> FilePath -> Sh ()
-mv a b = do a' <- absPath a
-            b' <- absPath b
-            trace $ "mv " `mappend` toTextIgnore a' `mappend` " " `mappend` toTextIgnore b'
-            liftIO $ rename a' b'
+mv from' to' = do
+  from <- absPath from'
+  to <- absPath to'
+  trace $ "mv " `mappend` toTextIgnore from `mappend` " " `mappend` toTextIgnore to
+  to_dir <- test_d to
+  let to_loc = if not to_dir then to else to FP.</> filename from
+  liftIO $ rename from to_loc
+    `catchany` (\e -> throwIO $
+	  ReThrownException e (extraMsg to_loc from)
+	)
+  where
+    extraMsg t f = "during copy from: " ++ unpack f ++ " to: " ++ unpack t
 
 -- | Get back [Text] instead of [FilePath]
 lsT :: FilePath -> Sh [Text]
@@ -377,7 +387,7 @@
 
 -- | exit 0 means no errors, all other codes are error conditions
 exit :: Int -> Sh a
-exit 0 = liftIO (exitWith ExitSuccess) `tag` "exit 0"
+exit 0 = liftIO exitSuccess `tag` "exit 0"
 exit n = liftIO (exitWith (ExitFailure n)) `tag` ("exit " `mappend` LT.pack (show n))
 
 -- | echo a message and exit with status 1
@@ -865,7 +875,7 @@
 
 -- | Pipe operator. set the stdout the first command as the stdin of the second.
 -- This does not create a shell-level pipe, but hopefully it will in the future.
--- To create a shell level pipe you can always set @escaping False@ and use a pipe @|@ character in a command.
+-- To create a shell level pipe you can set @escaping False@ and use a pipe @|@ character in a command.
 (-|-) :: Sh Text -> Sh b -> Sh b
 one -|- two = do
   res <- print_stdout False one
@@ -873,6 +883,7 @@
   two
 
 -- | Copy a file, or a directory recursively.
+-- uses 'cp'
 cp_r :: FilePath -> FilePath -> Sh ()
 cp_r from' to' = do
     from <- absPath from'
diff --git a/Shelly/Base.hs b/Shelly/Base.hs
--- a/Shelly/Base.hs
+++ b/Shelly/Base.hs
@@ -1,7 +1,8 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
--- | prevent circular dependencies
--- needed by multiple exposed modules
+-- | I started exposing multiple module (starting with one for finding)
+-- Base prevented circular dependencies
+-- However, Shelly went back to exposing a single module
 module Shelly.Base
   (
     ShIO, Sh, unSh, runSh, State(..), FilePath, Text,
diff --git a/shelly.cabal b/shelly.cabal
--- a/shelly.cabal
+++ b/shelly.cabal
@@ -1,6 +1,6 @@
 Name:       shelly
 
-Version:     0.15.1
+Version:     0.15.2
 Synopsis:    shell-like (systems) programming in Haskell
 
 Description: Shelly provides convenient systems programming in Haskell,
