diff --git a/hw-uri.cabal b/hw-uri.cabal
--- a/hw-uri.cabal
+++ b/hw-uri.cabal
@@ -1,7 +1,7 @@
 cabal-version:          2.4
 
 name:                   hw-uri
-version:                0.1.1.8
+version:                0.1.1.9
 synopsis:               Supports IO on URIs
 description:            Supports IO on URIs.
 homepage:               https://github.com/haskell-works/hw-uri
@@ -28,6 +28,7 @@
 common antiope-optparse-applicative   { build-depends: antiope-optparse-applicative   >= 7.0.1      && < 8      }
 common bytestring                     { build-depends: bytestring                     >= 0.10.8.2   && < 0.11   }
 common directory                      { build-depends: directory                      >= 1.3.3.0    && < 1.4    }
+common dlist                          { build-depends: dlist                          >= 0.8.0.7    && < 0.9    }
 common exceptions                     { build-depends: exceptions                     >= 0.10.1     && < 0.11   }
 common filepath                       { build-depends: filepath                       >= 1.3        && < 1.5    }
 common generic-lens                   { build-depends: generic-lens                   >= 1.1.0.0    && < 1.3    }
@@ -58,6 +59,7 @@
                       , antiope-s3
                       , bytestring
                       , directory
+                      , dlist
                       , exceptions
                       , filepath
                       , generic-lens
diff --git a/src/HaskellWorks/Data/Uri/IO/File.hs b/src/HaskellWorks/Data/Uri/IO/File.hs
--- a/src/HaskellWorks/Data/Uri/IO/File.hs
+++ b/src/HaskellWorks/Data/Uri/IO/File.hs
@@ -41,16 +41,16 @@
   let rs = if filePath /= "." then fmap (filePath </>) qs else qs
   return rs
   where go :: (MonadIO m, MonadUnliftIO m) => FilePath -> FilePath -> m [FilePath]
-        go filePath dir = do
-          ps <- listDirectory filePath
-          qs <- fmap concat $ IO.interleaveSequenceM $ fmap (recurse filePath) ps
+        go fp dir = do
+          ps <- listDirectory fp
+          qs <- fmap concat $ IO.interleaveSequenceM $ fmap (recurse fp) ps
           return (fmap (dir </>) qs)
 
         recurse :: (MonadIO m, MonadUnliftIO m) => FilePath -> FilePath -> m [FilePath]
-        recurse filePath p = do
-          isDirectory <- liftIO $ IO.doesDirectoryExist (filePath </> p)
+        recurse fp p = do
+          isDirectory <- liftIO $ IO.doesDirectoryExist (fp </> p)
           if isDirectory
-            then case filePath </> p of
+            then case fp </> p of
               subPath -> if "./" `L.isPrefixOf` subPath
                 then go (drop 2 subPath) p
                 else go subPath p
diff --git a/src/HaskellWorks/Data/Uri/IO/Lazy.hs b/src/HaskellWorks/Data/Uri/IO/Lazy.hs
--- a/src/HaskellWorks/Data/Uri/IO/Lazy.hs
+++ b/src/HaskellWorks/Data/Uri/IO/Lazy.hs
@@ -35,9 +35,10 @@
 import HaskellWorks.Data.Uri.UriError
 
 import qualified Antiope.S3                       as AWS
-import qualified Antiope.S3.Lazy                  as AWS
+import qualified Antiope.S3.Lazy                  as AWSL
 import qualified Control.Concurrent               as IO
 import qualified Data.ByteString.Lazy             as LBS
+import qualified Data.DList                       as DL
 import qualified Data.Text                        as T
 import qualified HaskellWorks.Data.Uri.IO.Console as CIO
 import qualified HaskellWorks.Data.Uri.IO.File    as FIO
@@ -73,7 +74,7 @@
     _                                 -> throwM e
 
 getS3Uri :: (MonadResource m, MonadCatch m) => AWS.Env -> AWS.S3Uri -> m (Either UriError LBS.ByteString)
-getS3Uri envAws (AWS.S3Uri b k) = handleAwsError $ runAws envAws $ AWS.unsafeDownload b k
+getS3Uri envAws (AWS.S3Uri b k) = handleAwsError $ runAws envAws $ AWSL.unsafeDownload b k
 
 readResource :: (MonadResource m, MonadCatch m) => AWS.Env -> Location -> m (Either UriError LBS.ByteString)
 readResource envAws = \case
@@ -237,7 +238,7 @@
 
 listResourcePrefix :: (MonadUnliftIO m, MonadResource m) => AWS.Env -> Location -> ExceptT UriError m [Location]
 listResourcePrefix envAws location = case location of
-  S3 s3Uri   -> fmap S3 <$> runAws envAws (AWS.lsPrefix (s3Uri ^. the @"bucket") (s3Uri ^. the @"objectKey" . the @1))
+  S3 s3Uri   -> fmap S3 . DL.toList <$> runAws envAws (AWSL.dlistS3Uris (AWSL.s3UriToListObjectsV2 s3Uri))
   Local path -> fmap Local <$> lift (FIO.listFilesRecursiveWithPrefix path)
   HttpUri _  -> throwError "HTTP method not supported"
 
@@ -248,4 +249,3 @@
     when (result /= [s3Uri]) $ throwError $ DeleteFailed (tshow location)
   Local path      -> liftIO $ IO.removeFile path
   HttpUri _ -> throwError "HTTP method not supported"
-
diff --git a/src/HaskellWorks/Data/Uri/UriError.hs b/src/HaskellWorks/Data/Uri/UriError.hs
--- a/src/HaskellWorks/Data/Uri/UriError.hs
+++ b/src/HaskellWorks/Data/Uri/UriError.hs
@@ -7,6 +7,7 @@
   , uriErrorStatus
   ) where
 
+import Data.Semigroup             ((<>))
 import Data.String
 import Data.Text                  (Text)
 import GHC.Generics
@@ -37,6 +38,7 @@
 displayUriError RetriesFailedUriError = "Multiple retries failed"
 displayUriError NotFound              = "Not found"
 displayUriError (GenericUriError msg) = msg
+displayUriError (DeleteFailed msg)    = "Delete failed: " <> msg
 
 uriErrorStatus :: UriError -> Maybe Int
 uriErrorStatus (AwsUriError (HTTP.Status statusCode _)) = Just statusCode
