diff --git a/Debian/URI.hs b/Debian/URI.hs
--- a/Debian/URI.hs
+++ b/Debian/URI.hs
@@ -1,5 +1,6 @@
-{-# LANGUAGE PackageImports #-}
-{-# OPTIONS -fno-warn-orphans #-}
+{-# LANGUAGE CPP, PackageImports #-}
+{-# OPTIONS -Wall -fno-warn-orphans #-}
+
 module Debian.URI
     ( module Network.URI
     , URI'
@@ -12,14 +13,22 @@
     , dirFromURI
     ) where
 
-import Control.Exception (SomeException, try)
+#if !MIN_VERSION_base(4,8,0)
+import Control.Applicative ((<$>))
+#endif
+import Control.Exception (SomeException, throw, try)
 import Data.ByteString.Lazy.UTF8 as L
 import qualified Data.ByteString.Lazy.Char8 as L
 import Data.Maybe (catMaybes, fromJust)
+import Data.Text as T (unpack)
+import Data.Text.Encoding (decodeUtf8)
 import Network.URI (URI(..), URIAuth(..), parseURI, uriToString)
 import System.Directory (getDirectoryContents)
+import System.Exit (ExitCode(..))
 -- import System.Process.ByteString (readProcessWithExitCode)
-import System.Process.ByteString.Lazy (readProcessWithExitCode)
+import System.Process (CreateProcess, proc)
+import System.Process.Common (showCreateProcessForUser)
+import System.Process.ByteString.Lazy (readCreateProcessWithExitCode)
 import Text.Regex (mkRegex, matchRegex)
 
 -- | A wrapper around a String containing a known parsable URI.  Not
@@ -50,16 +59,10 @@
     case (uriScheme uri, uriAuthority uri) of
       ("file:", Nothing) -> L.readFile (uriPath uri)
       -- ("ssh:", Just auth) -> cmdOutputStrict ("ssh " ++ uriUserInfo auth ++ uriRegName auth ++ uriPort auth ++ " cat " ++ show (uriPath uri))
-      ("ssh:", Just auth) -> do
-          let cmd = "ssh"
-              args = [uriUserInfo auth ++ uriRegName auth ++ uriPort auth, "cat", uriPath uri]
-          (_code, out, _err) <- readProcessWithExitCode cmd args L.empty
-          return out
-      _ -> do
-          let cmd = "curl"
-              args = ["-s", "-g", uriToString' uri]
-          (_code, out, _err) <- readProcessWithExitCode cmd args L.empty
-          return out
+      ("ssh:", Just auth) ->
+          run (proc "ssh" [uriUserInfo auth ++ uriRegName auth ++ uriPort auth, "cat", uriPath uri])
+      _ ->
+          run (proc "curl" ["-s", "-g", uriToString' uri])
 
 -- | Parse the text returned when a directory is listed by a web
 -- server.  This is currently only known to work with Apache.
@@ -79,12 +82,18 @@
     case (uriScheme uri, uriAuthority uri) of
       ("file:", Nothing) -> getDirectoryContents (uriPath uri)
       ("ssh:", Just auth) ->
-          do let cmd = "ssh"
-                 args = [uriUserInfo auth ++ uriRegName auth ++ uriPort auth, "ls", "-1", uriPath uri]
-             (_code, out, _err) <- readProcessWithExitCode cmd args L.empty
-             return . Prelude.lines . L.toString $ out
+          (Prelude.lines . L.toString) <$>
+            run (proc "ssh" [uriUserInfo auth ++ uriRegName auth ++ uriPort auth, "ls", "-1", uriPath uri])
       _ ->
-          do let cmd = "curl"
-                 args = ["-s", "-g", uriToString' uri]
-             (_code, out, _err) <- readProcessWithExitCode cmd args L.empty
-             return . webServerDirectoryContents $ out
+          webServerDirectoryContents <$>
+            run (proc "curl" ["-s", "-g", uriToString' uri])
+
+run :: CreateProcess -> IO L.ByteString
+run cp = do
+  (code, out, err) <- readCreateProcessWithExitCode cp L.empty
+  case code of
+    ExitSuccess -> return out
+    ExitFailure _ -> throw (userError (show code ++ "\n" ++
+                                       " command: " ++ showCreateProcessForUser cp ++ "\n" ++
+                                       " stderr: " ++ unpack (decodeUtf8 (L.toStrict err)) ++ "\n" ++
+                                       " stdout: " ++ unpack (decodeUtf8 (L.toStrict out))))
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,21 @@
+haskell-debian (3.93.5) unstable; urgency=medium
+
+  * Restore import of <$> for older versions of base.
+
+ -- David Fox <dsf@x1>  Fri, 18 Jan 2019 19:04:40 -0800
+
+haskell-debian (3.93.4) unstable; urgency=medium
+
+  * Handle errors in the shell commands run by functions in Debian.URI
+
+ -- David Fox <dsf@seereason.com>  Fri, 18 Jan 2019 06:25:22 -0800
+
+haskell-debian (3.93.3) unstable; urgency=medium
+
+  * Changes for ghc-8.6
+
+ -- David Fox <dsf@seereason.com>  Tue, 01 Jan 2019 15:57:16 -0800
+
 haskell-debian (3.93.2) unstable; urgency=low
 
   * Put SHA256 checksums into package info rather than obsolete md5
diff --git a/debian.cabal b/debian.cabal
--- a/debian.cabal
+++ b/debian.cabal
@@ -1,5 +1,5 @@
 Name:           debian
-Version:        3.93.3
+Version:        3.93.5
 License:        BSD3
 License-File:   debian/copyright
 Author:         David Fox <dsf@seereason.com>, Jeremy Shaw <jeremy@seereason.com>, Clifford Beshers <beshers@seereason.com>
diff --git a/debian/changelog b/debian/changelog
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,15 @@
+haskell-debian (3.93.5) unstable; urgency=medium
+
+  * Restore import of <$> for older versions of base.
+
+ -- David Fox <dsf@x1>  Fri, 18 Jan 2019 19:04:40 -0800
+
+haskell-debian (3.93.4) unstable; urgency=medium
+
+  * Handle errors in the shell commands run by functions in Debian.URI
+
+ -- David Fox <dsf@seereason.com>  Fri, 18 Jan 2019 06:25:22 -0800
+
 haskell-debian (3.93.3) unstable; urgency=medium
 
   * Changes for ghc-8.6
