diff --git a/cabal-install/Distribution/Client/Upload.hs b/cabal-install/Distribution/Client/Upload.hs
index 10e247d40ae919995eafe0fd4e42c5482990ef60..cdb756820a6e1cf6e156c63a136eb7a556d40c1d 100644
--- a/cabal-install/Distribution/Client/Upload.hs
+++ b/cabal-install/Distribution/Client/Upload.hs
@@ -15,7 +15,7 @@ import Distribution.Client.Config
 import qualified Distribution.Client.BuildReports.Anonymous as BuildReport
 import qualified Distribution.Client.BuildReports.Upload as BuildReport
 
-import Network.URI (URI(uriPath), parseURI, parseRelativeReference, relativeTo)
+import Network.URI (URI(uriPath), parseURI)
 
 import System.IO        (hFlush, stdin, stdout, hGetEcho, hSetEcho)
 import Control.Exception (bracket)
@@ -26,9 +26,6 @@ import Control.Monad (forM_, when)
 
 type Auth = Maybe (String, String)
 
-uploadReference :: URI
-Just uploadReference = parseRelativeReference "/upload"
-
 checkURI :: URI
 Just checkURI = parseURI "http://hackage.haskell.org/cgi-bin/hackage-scripts/check-pkg"
 
@@ -39,7 +36,10 @@ upload transport verbosity repos mUsername mPassword paths = do
         [] -> die $ "Cannot upload. No remote repositories are configured."
         rs -> remoteRepoTryUpgradeToHttps transport (last rs)
     let targetRepoURI = remoteRepoURI targetRepo
-        uploadURI = uploadReference `relativeTo` targetRepoURI
+        rootIfEmpty x = if null x then "/" else x
+        uploadURI = targetRepoURI {
+            uriPath = rootIfEmpty (uriPath targetRepoURI) FilePath.Posix.</> "upload"
+        }
     Username username <- maybe promptUsername return mUsername
     Password password <- maybe promptPassword return mPassword
     let auth = Just (username,password)