diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,15 @@
 
 `hslua-module-paths` uses [PVP Versioning][].
 
+## hslua-module-path-1.0.3
+
+Released 2022-08-19.
+
+-   Fixed `make_relative` for longer base paths: Ensure that the
+    function produces correct results in cases where the root
+    (base) path has more components than the path that should be
+    made relative.
+
 ## hslua-module-path-1.0.2
 
 Released 2022-02-19.
diff --git a/hslua-module-path.cabal b/hslua-module-path.cabal
--- a/hslua-module-path.cabal
+++ b/hslua-module-path.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                hslua-module-path
-version:             1.0.2
+version:             1.0.3
 synopsis:            Lua module to work with file paths.
 description:         Lua module to work with file paths in a platform
                      independent way.
@@ -22,8 +22,8 @@
                    , GHC == 8.6.5
                    , GHC == 8.8.4
                    , GHC == 8.10.7
-                   , GHC == 9.0.1
-                   , GHC == 9.2.1
+                   , GHC == 9.0.2
+                   , GHC == 9.2.3
 
 source-repository head
   type:                git
diff --git a/src/HsLua/Module/Path.hs b/src/HsLua/Module/Path.hs
--- a/src/HsLua/Module/Path.hs
+++ b/src/HsLua/Module/Path.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE CPP #-}
-{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-|
 Module      : HsLua.Module.Path
@@ -34,7 +33,6 @@
   )
 where
 
-import Data.Char (toLower)
 #if !MIN_VERSION_base(4,11,0)
 import Data.Semigroup (Semigroup(..))  -- includes (<>)
 #endif
@@ -338,40 +336,17 @@
              -> FilePath      -- ^ root directory from which to start
              -> Maybe Bool    -- ^ whether to use unsafe relative paths.
              -> FilePath
-makeRelative path root unsafe
+makeRelative path root (Just True)
  | Path.equalFilePath root path = "."
- | takeAbs root /= takeAbs path = path
- | otherwise = go (dropAbs path) (dropAbs root)
-  where
-    go x "" = dropWhile Path.isPathSeparator x
-    go x y =
-      let (x1, x2) = breakPath x
-          (y1, y2) = breakPath y
-      in case () of
-        _ | Path.equalFilePath x1 y1 -> go x2 y2
-        _ | unsafe == Just True      -> Path.joinPath ["..", x1, go x2 y2]
-        _                            -> path
-
-    breakPath = both (dropWhile Path.isPathSeparator)
-              . break Path.isPathSeparator
-              . dropWhile Path.isPathSeparator
-
-    both f (a, b) = (f a, f b)
-
-    leadingPathSepOnWindows = \case
-      ""                  -> False
-      x | Path.hasDrive x -> False
-      c:_                 -> Path.isPathSeparator c
-
-    dropAbs x = if leadingPathSepOnWindows x then tail x else Path.dropDrive x
-
-    takeAbs x = if leadingPathSepOnWindows x
-                then [Path.pathSeparator]
-                else map (\y ->
-                            if Path.isPathSeparator y
-                            then Path.pathSeparator
-                            else toLower y)
-                         (Path.takeDrive x)
+ | Path.takeDrive root /= Path.takeDrive path = path
+ | otherwise =
+   let toParts = Path.splitDirectories . Path.normalise
+       go (pp:pps) (rp:rps)
+         | pp == rp = go pps rps
+       go pps rps
+         = Path.joinPath $ replicate (length rps) ".." ++ pps
+   in go (toParts path) (toParts root)
+makeRelative path root _unsafe = Path.makeRelative root path
 
 -- | First published version of this library.
 initialVersion :: Version
diff --git a/test/test-path.lua b/test/test-path.lua
--- a/test/test-path.lua
+++ b/test/test-path.lua
@@ -145,29 +145,57 @@
   },
 
   group 'make_relative' {
-    test('just the filename if file is within path', function()
-      assert.are_equal(
-        path.make_relative('/foo/bar/file.txt', '/foo/bar'),
-        'file.txt'
-      )
-    end),
-    test('no change if name outside of reference dir', function()
-      assert.are_equal(
-        path.make_relative('/foo/baz/file.txt', '/foo/bar'),
-        '/foo/baz/file.txt'
-      )
-    end),
-    test('use `..` when allowing unsafe operation', function()
-      assert.are_equal(
-        path.make_relative('/foo/baz/file.txt', '/foo/bar', true),
-        path.join{'..', 'baz', 'file.txt'}
-      )
-    end),
-    test('return dot if both paths are the same', function()
-      assert.are_equal(
-        path.make_relative('/one/two/three', '/one/two/three/'),
-        '.'
-      )
-    end)
+    group 'safe' {
+      test('just the filename if file is within path', function()
+        assert.are_equal(
+          path.make_relative('/foo/bar/file.txt', '/foo/bar'),
+          'file.txt'
+        )
+      end),
+      test('no change if name outside of reference dir', function()
+        assert.are_equal(
+          path.make_relative('/foo/baz/file.txt', '/foo/bar'),
+          '/foo/baz/file.txt'
+        )
+      end),
+      test('return dot if both paths are the same', function()
+        assert.are_equal(
+          path.make_relative('/one/two/three', '/one/two/three/'),
+          '.'
+        )
+      end),
+    },
+    group 'unsafe' {
+      test('just the filename if file is within path', function()
+        assert.are_equal(
+          path.make_relative('/foo/bar/file.txt', '/foo/bar', true),
+          'file.txt'
+        )
+      end),
+      test('use `..` to reach parent directory', function()
+        assert.are_equal(
+          path.make_relative('/foo/baz/file.txt', '/foo/bar', true),
+          path.join{'..', 'baz', 'file.txt'}
+        )
+      end),
+      test('no change if base differs', function()
+        assert.are_equal(
+          path.make_relative('foo/baz/file.txt', '/foo/bar', true),
+          'foo/baz/file.txt'
+        )
+      end),
+      test('long base path ', function()
+        assert.are_equal(
+          path.make_relative('a/d.png', 'a/b/c', true),
+          path.join{'..', '..', 'd.png'}
+        )
+      end),
+      test('return dot if both paths are the same', function()
+        assert.are_equal(
+          path.make_relative('/one/two/three', '/one/two/three/', true),
+          '.'
+        )
+      end)
+    }
   },
 }
