diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for file-io
 
+## 0.1.4 -- 2024-08-10
+
+* fix build on GHC <= 8.10
+
 ## 0.1.3 -- 2024-08-08
 
 * add `openTempFile` , `openBinaryTempFile` , `openTempFileWithDefaultPermissions` and `openBinaryTempFileWithDefaultPermissions` wrt [#2](https://github.com/hasufell/file-io/issues/2)
diff --git a/file-io.cabal b/file-io.cabal
--- a/file-io.cabal
+++ b/file-io.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               file-io
-version:            0.1.3
+version:            0.1.4
 synopsis:           Basic file IO operations via 'OsPath'
 description:        Basic file IO operations like Prelude, but for 'OsPath'.
 homepage:           https://github.com/hasufell/file-io
diff --git a/windows/System/File/Platform.hsc b/windows/System/File/Platform.hsc
--- a/windows/System/File/Platform.hsc
+++ b/windows/System/File/Platform.hsc
@@ -102,7 +102,7 @@
   Win32.fILE_SHARE_DELETE .|.
   Win32.fILE_SHARE_READ
 
-  -- | Open an existing file and return the 'Handle'.
+-- | Open an existing file and return the 'Handle'.
 openExistingFile :: WindowsPath -> IOMode -> IO Handle
 openExistingFile fp iomode = bracketOnError
     (WS.createFile
@@ -168,6 +168,7 @@
 #endif
       withTString label $ \c_template ->
         withTString suffix $ \c_suffix ->
+#if MIN_VERSION_base(4, 15, 0)
           with nullPtr $ \c_ptr -> do
             res <- c_createUUIDTempFileErrNo c_tmp_dir c_template c_suffix c_ptr
             if not res
@@ -178,13 +179,31 @@
                        free c_p
                        let flags = fromIntegral mode .&. o_EXCL
                        handleResultsWinIO filename (flags == o_EXCL)
+#else
+            -- NOTE: revisit this when new I/O manager in place and use a UUID
+            --       based one when we are no longer MAX_PATH bound.
+            allocaBytes (sizeOf (undefined :: CWchar) * 260) $ \c_str -> do
+            res <- c_getTempFileNameErrorNo c_tmp_dir c_template c_suffix 0
+                                            c_str
+            if not res
+               then do errno <- getErrno
+                       ioError (errnoToIOError loc errno Nothing (Just $ lenientDecode tmp_dir))
+               else do filename <- peekTString c_str
+                       let flags = fromIntegral mode .&. o_EXCL
+                       handleResultsWinIO filename (flags == o_EXCL)
+#endif
 
   handleResultsWinIO filename excl = do
     h <- (if excl then openExistingFile else openFile) filename ReadWriteMode
     return (filename, h)
 
+#if MIN_VERSION_base(4, 15, 0)
 foreign import ccall "__createUUIDTempFileErrNo" c_createUUIDTempFileErrNo
   :: CWString -> CWString -> CWString -> Ptr CWString -> IO Bool
+#else
+foreign import ccall "getTempFileNameErrorNo" c_getTempFileNameErrorNo
+  :: CWString -> CWString -> CWString -> CUInt -> Ptr CWchar -> IO Bool
+#endif
 
 
 
