diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for cabal-appimage
 
+## 0.4.0.0 -- 2023-01-11
+
+* Allow resources to have directory structure (thanks to Sandy Maguire).
+
+
 ## 0.3.0.5 -- 2022-09-11
 
 * Build with GHC 9.4.
diff --git a/cabal-appimage.cabal b/cabal-appimage.cabal
--- a/cabal-appimage.cabal
+++ b/cabal-appimage.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.0
 name:                cabal-appimage
-version:             0.3.0.5
+version:             0.4.0.0
 synopsis:            Cabal support for creating AppImage applications
 description:         This package provides a build hook automating the
                      creation of AppImage bundles.
diff --git a/src/Distribution/AppImage.hs b/src/Distribution/AppImage.hs
--- a/src/Distribution/AppImage.hs
+++ b/src/Distribution/AppImage.hs
@@ -44,8 +44,11 @@
   -- | Application icons.
   appIcons        :: [FilePath],
   -- | Other resources to bundle. Stored in the @\usr\/share\//appName/@
-  -- directory inside the image.
-  appResources    :: [FilePath],
+  -- directory inside the image. The first 'FilePath' is on the local system.
+  -- The @Maybe 'FilePath'@ is the desired file path relative to
+  -- @\usr\/share\//appName/@, or the directoryless filename in the case of
+  -- 'Nothing'.
+  appResources    :: [(FilePath, Maybe FilePath)],
   -- | Hook to customize the generated @AppDir@ before final packaging.
   appDirCustomize :: Maybe AppDirCustomize
   }
@@ -100,12 +103,15 @@
     , "--desktop-file=" ++ appDesktop ] ++
     map ("--icon-file=" ++) appIcons
 
-bundleFiles :: [FilePath] -> FilePath -> Verbosity -> IO ()
-bundleFiles files dest verb = prepare >> mapM_ copy files
+bundleFiles :: [(FilePath, Maybe FilePath)] -> FilePath -> Verbosity -> IO ()
+bundleFiles files dest verb = prepare >> mapM_ (uncurry copy) files
   where
     prepare = createDirectoryIfMissingVerbose verb True dest
 
-    copy file = copyFileVerbose verb file (dest </> takeFileName file)
+    copy file destfile = do
+      let fp = dest </> fromMaybe (takeFileName file) destfile
+      createDirectoryIfMissingVerbose verb True $ takeDirectory fp
+      copyFileVerbose verb file fp
 
 bundleApp :: FilePath -> Verbosity -> IO ()
 bundleApp appDir verb = do
