diff --git a/System/Directory.hs b/System/Directory.hs
--- a/System/Directory.hs
+++ b/System/Directory.hs
@@ -143,6 +143,15 @@
 normally at least one absolute path to each file system object.  In
 some operating systems, it may also be possible to have paths which
 are relative to the current directory.
+
+Unless otherwise documented:
+
+* 'IO' operations in this package may throw any 'IOError'.  No other types of
+  exceptions shall be thrown.
+
+* The list of possible 'IOErrorType's in the API documentation is not
+  exhaustive.  The full list may vary by platform and/or evolve over time.
+
 -}
 
 -----------------------------------------------------------------------------
@@ -1336,13 +1345,21 @@
   (`ioeAddLocation` "removeDirectoryLink") `modifyIOError` do
     removePathInternal linkToDirectoryIsDirectory path
 
--- | Check whether the path refers to a symbolic link.  An exception is thrown
--- if the path does not exist or is inaccessible.
+-- | Check whether an existing @path@ is a symbolic link.  If @path@ is a
+-- regular file or directory, 'False' is returned.  If @path@ does not exist
+-- or is otherwise inaccessible, an exception is thrown (see below).
 --
 -- On Windows, this checks for @FILE_ATTRIBUTE_REPARSE_POINT@.  In addition to
 -- symbolic links, the function also returns true on junction points.  On
 -- POSIX systems, this checks for @S_IFLNK@.
 --
+-- The operation may fail with:
+--
+-- * 'isDoesNotExistError' if the symbolic link does not exist; or
+--
+-- * 'isPermissionError' if the user is not permitted to read the symbolic
+--   link.
+--
 -- @since 1.3.0.0
 pathIsSymbolicLink :: FilePath -> IO Bool
 pathIsSymbolicLink path =
@@ -1518,6 +1535,10 @@
 --   Note: The directory may not actually exist, in which case you would need
 --   to create it with file mode @700@ (i.e. only accessible by the owner).
 --
+--   As of 1.3.5.0, the environment variable is ignored if set to a relative
+--   path, per revised XDG Base Directory Specification.  See
+--   <https://github.com/haskell/directory/issues/100 #100>.
+--
 --   @since 1.2.3.0
 getXdgDirectory :: XdgDirectory         -- ^ which special directory
                 -> FilePath             -- ^ a relative path that is appended
@@ -1532,8 +1553,8 @@
         XdgConfig -> "XDG_CONFIG_HOME"
         XdgCache  -> "XDG_CACHE_HOME"
       case env of
-        Nothing   -> getXdgDirectoryFallback getHomeDirectory xdgDir
-        Just path -> pure path
+        Just path | isAbsolute path -> pure path
+        _                           -> getXdgDirectoryFallback getHomeDirectory xdgDir
 
 -- | Similar to 'getXdgDirectory' but retrieves the entire list of XDG
 -- directories.
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,6 +1,13 @@
 Changelog for the [`directory`][1] package
 ==========================================
 
+## 1.3.5.0 (December 2019)
+
+  * Revert change introduced in the version `1.3.3.2`: Non-absolute `XDG_*`
+    environment variables are ignored.  This behavior is according to
+    [*XDG Base Directory Specification* version 0.7](https://specifications.freedesktop.org/basedir-spec/0.7/ar01s02.html)
+    ([#100](https://github.com/haskell/directory/issues/100))
+
 ## 1.3.4.0 (July 2019)
 
   * `getXdgDirectory` and `getXdgDirectoryList` on Windows will now respect
diff --git a/directory.cabal b/directory.cabal
--- a/directory.cabal
+++ b/directory.cabal
@@ -1,6 +1,5 @@
 name:           directory
-version:        1.3.4.0
--- NOTE: Don't forget to update ./changelog.md
+version:        1.3.5.0
 license:        BSD3
 license-file:   LICENSE
 maintainer:     libraries@haskell.org
@@ -55,7 +54,7 @@
     include-dirs: .
 
     build-depends:
-        base     >= 4.5 && < 4.14,
+        base     >= 4.5 && < 4.15,
         time     >= 1.4 && < 1.10,
         filepath >= 1.3 && < 1.5
     if os(windows)
diff --git a/tests/Xdg.hs b/tests/Xdg.hs
--- a/tests/Xdg.hs
+++ b/tests/Xdg.hs
@@ -3,8 +3,11 @@
 #if MIN_VERSION_base(4, 7, 0)
 import qualified Data.List as List
 import System.Environment (setEnv, unsetEnv)
-import System.FilePath ((</>), searchPathSeparator)
+import System.FilePath (searchPathSeparator)
+#if !defined(mingw32_HOST_OS)
+import System.FilePath ((</>))
 #endif
+#endif
 #include "util.inl"
 
 main :: TestEnv -> IO ()
@@ -24,12 +27,21 @@
   T(expectEq) () (home </> ".config/mow") =<< getXdgDirectory XdgConfig "mow"
 #endif
 
+  -- unset variables, so env doesn't affect test running
+  unsetEnv "XDG_DATA_HOME"
+  unsetEnv "XDG_CONFIG_HOME"
+  unsetEnv "XDG_CACHE_HOME"
+  xdgData   <- getXdgDirectory XdgData   "ff"
+  xdgConfig <- getXdgDirectory XdgConfig "oo"
+  xdgCache  <- getXdgDirectory XdgCache  "rk"
+
+  -- non-absolute paths are ignored, and the fallback is used
   setEnv "XDG_DATA_HOME"   "ar"
   setEnv "XDG_CONFIG_HOME" "aw"
   setEnv "XDG_CACHE_HOME"  "ba"
-  T(expectEq) () ("ar" </> "ff") =<< getXdgDirectory XdgData   "ff"
-  T(expectEq) () ("aw" </> "oo") =<< getXdgDirectory XdgConfig "oo"
-  T(expectEq) () ("ba" </> "rk") =<< getXdgDirectory XdgCache  "rk"
+  T(expectEq) () xdgData   =<< getXdgDirectory XdgData   "ff"
+  T(expectEq) () xdgConfig =<< getXdgDirectory XdgConfig "oo"
+  T(expectEq) () xdgCache  =<< getXdgDirectory XdgCache  "rk"
 
   unsetEnv "XDG_CONFIG_DIRS"
   unsetEnv "XDG_DATA_DIRS"
