diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,13 @@
 
 `hslua-module-system` uses [PVP Versioning][].
 
+## hslua-module-system-1.2.2
+
+Released 2025-08-09.
+
+-   Lists of file paths now have a "FilePath list" metatable that
+    add list methods.
+
 ## hslua-module-system-1.2.1.1
 
 Released 2025-07-23.
diff --git a/hslua-module-system.cabal b/hslua-module-system.cabal
--- a/hslua-module-system.cabal
+++ b/hslua-module-system.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                hslua-module-system
-version:             1.2.1.1
+version:             1.2.2
 synopsis:            Lua module wrapper around Haskell's System module.
 
 description:         Provides access to system information and
@@ -39,6 +39,7 @@
   default-language:    Haskell2010
   build-depends:       base                 >= 4.11   && < 5
                      , hslua-core           >= 2.1    && < 2.4
+                     , hslua-list           >= 1.1    && < 1.2
                      , hslua-packaging      >= 2.3    && < 2.4
   default-extensions:  LambdaCase
                      , OverloadedStrings
diff --git a/src/HsLua/Module/System.hs b/src/HsLua/Module/System.hs
--- a/src/HsLua/Module/System.hs
+++ b/src/HsLua/Module/System.hs
@@ -52,6 +52,7 @@
 import Data.Text (Text)
 import Data.Version (versionBranch)
 import HsLua.Core
+import HsLua.List (newListMetatable)
 import HsLua.Marshalling
 import HsLua.Packaging
 import HsLua.Module.SystemUtils
@@ -294,7 +295,7 @@
   <#> opt (stringParam "directory"
            ("Path of the directory whose contents should be listed. "
             `T.append` "Defaults to `.`."))
-  =#> functionResult (pushList pushString) "table"
+  =#> functionResult (pushFilePathList pushString) "table"
         ("A table of all entries in `directory`, except for the "
           `T.append` "special entries (`.`  and `..`).")
   #? "List the contents of a directory."
@@ -564,7 +565,7 @@
   <#> opt (filepathParam "filepath"
            ("relative path that is appended to the path; ignored " <>
             "if the result is a list of search paths."))
-  =#> functionResult (either pushString (pushList pushString))
+  =#> functionResult (either pushString (pushFilePathList pushString))
         "string|{string,...}"
         "Either a single file path, or a list of search paths."
   #? T.unlines
@@ -649,3 +650,10 @@
       (\s -> fromMaybe s $ T.stripPrefix "xdg" s)
       . T.filter (/= '_')
       . T.toLower
+
+-- | Pushes a list of file paths.
+pushFilePathList :: LuaError e => Pusher e [FilePath]
+pushFilePathList fps = do
+  pushList pushString fps
+  newListMetatable "FilePath list" (pure ())
+  setmetatable (nth 2)
