diff --git a/antiope-s3.cabal b/antiope-s3.cabal
--- a/antiope-s3.cabal
+++ b/antiope-s3.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: b136f26caee3f70a03b45b3a3210ac5a8432285cc62b59f1ceb669e17839bded
+-- hash: 3ca4d7ebcb62cbfab41eb5730b74a19e7bfef678711ad92e24e8e7fbb5252d44
 
 name:           antiope-s3
-version:        6.1.3
+version:        6.1.4
 description:    Please see the README on Github at <https://github.com/arbor/antiope#readme>
 category:       Services
 homepage:       https://github.com/arbor/antiope#readme
diff --git a/src/Antiope/S3/Lazy.hs b/src/Antiope/S3/Lazy.hs
--- a/src/Antiope/S3/Lazy.hs
+++ b/src/Antiope/S3/Lazy.hs
@@ -2,40 +2,46 @@
 
 module Antiope.S3.Lazy
   ( unsafeDownload
+  , unsafeDownloadRequest
   , download
+  , downloadRequest
   , downloadFromS3Uri
   ) where
 
+import Antiope.Core.Error
 import Antiope.S3.GetObject
 import Antiope.S3.Types             (S3Uri (S3Uri))
 import Control.Lens
-import Control.Monad.Catch          (catch)
 import Control.Monad.Trans.Resource
-import Network.AWS                  (Error (..), MonadAWS, ServiceError (..))
-import Network.HTTP.Types.Status    (Status (..))
+import Network.AWS                  (MonadAWS)
 
 import qualified Data.ByteString.Lazy as LBS
+import qualified Network.AWS          as AWS
 import qualified Network.AWS.S3       as AWS
 
+unsafeDownloadRequest :: (MonadAWS m, MonadResource m)
+  => AWS.GetObject
+  -> m LBS.ByteString
+unsafeDownloadRequest req = do
+  resp <- AWS.send req
+  lazyByteString (resp ^. AWS.gorsBody)
+
 unsafeDownload :: (MonadAWS m, MonadResource m)
   => AWS.BucketName
   -> AWS.ObjectKey
   -> m LBS.ByteString
-unsafeDownload bucketName objectKey = do
-  resp <- getObject bucketName objectKey
-  lazyByteString (resp ^. AWS.gorsBody)
+unsafeDownload bucketName objectKey = unsafeDownloadRequest (AWS.getObject bucketName objectKey)
 
+downloadRequest :: (MonadAWS m, MonadResource m)
+  => AWS.GetObject
+  -> m (Maybe LBS.ByteString)
+downloadRequest req = handle404ToNone (unsafeDownloadRequest req)
+
 download :: (MonadAWS m, MonadResource m)
   => AWS.BucketName
   -> AWS.ObjectKey
   -> m (Maybe LBS.ByteString)
-download bucketName objectKey = do
-  ebs <- (Right <$> unsafeDownload bucketName objectKey) `catch` \(err :: Error) -> case err of
-    (ServiceError (ServiceError' _ (Status 404 _) _ _ _ _)) -> return (Left LBS.empty)
-    _                                                       -> throwM err
-  case ebs of
-    Right bs -> return (Just bs)
-    Left _   -> return Nothing
+download bucketName objectKey = downloadRequest (AWS.getObject bucketName objectKey)
 
 downloadFromS3Uri :: (MonadAWS m, MonadResource m)
   => S3Uri
