diff --git a/cabal-install/Distribution/Client/HttpUtils.hs b/cabal-install/Distribution/Client/HttpUtils.hs
index b3ed93233973bd3f1a4f1192827dac485e5d8dce..8396079546211002f1c0a7fbcea45b5803391a60 100644
--- a/cabal-install/Distribution/Client/HttpUtils.hs
+++ b/cabal-install/Distribution/Client/HttpUtils.hs
@@ -103,8 +103,10 @@ downloadURI verbosity uri path | uriScheme uri == "file:" = do
   -- hash matches to avoid unnecessary computation?
 downloadURI verbosity uri path = do
   let etagPath = path <.> "etag"
+  targetExists   <- doesFileExist path
   etagPathExists <- doesFileExist etagPath
-  etag <- if etagPathExists
+  -- In rare cases the target file doesn't exist, but the etag does.
+  etag <- if targetExists && etagPathExists
             then liftM Just $ readFile etagPath
             else return Nothing
 
@@ -116,8 +118,8 @@ downloadURI verbosity uri path = do
           (3,0,4) -> Right rsp
           (a,b,c) -> Left err
             where
-              err = ErrorMisc $ "Unsucessful HTTP code: "
-                            ++ concatMap show [a,b,c]
+              err = ErrorMisc $ "Error HTTP code: "
+                                ++ concatMap show [a,b,c]
 
   -- Only write the etag if we get a 200 response code.
   -- A 304 still sends us an etag header.