diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 1.3
+
+* Generated directory names are now based on random hex strings rather than PIDs.
+
+    This got a major version bump as a courtesy to users who may depend on the
+    specific form of generated names, but that form is not part of the API
+    contract and should not be depended upon.
+
 ## 1.2.1.1
 
 * Improve the docs
diff --git a/System/IO/Temp.hs b/System/IO/Temp.hs
--- a/System/IO/Temp.hs
+++ b/System/IO/Temp.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE CPP, ScopedTypeVariables #-}
 -- | Functions to create temporary files and directories.
 --
 -- Most functions come in two flavours: those that create files/directories
@@ -21,11 +21,15 @@
 -- placed between between the name and the extension to yield a unique file
 -- name, e.g.  @name1804289383846930886.ext@.
 --
--- For directories, no extension is recognized, so a number will be simply
--- appended to the end of the template. Moreover, the number will be
--- smaller, as it is derived from the current process's PID
--- (but the result is still a unique directory name). So, for instance,
--- the directory template @dir@ may result in a directory named @dir30112@.
+-- For directories, no extension is recognized.
+-- A random hexadecimal string (whose length depends on the system's word
+-- size) is appended to the end of the template.
+-- For instance,
+-- the directory template @dir@ may result in a directory named
+-- @dir-e4bd89e5d00acdee@.
+--
+-- You shouldn't rely on the specific form of file or directory names
+-- generated by the library; it has changed in the past and may change in the future.
 module System.IO.Temp (
     withSystemTempFile, withSystemTempDirectory,
     withTempFile, withTempDirectory,
@@ -43,17 +47,23 @@
 import qualified Control.Monad.Catch as MC
 
 import Control.Monad.IO.Class
+import Data.Bits -- no import list: we use different functions
+                 -- depending on the base version
+#if !MIN_VERSION_base(4,8,0)
+import Data.Word (Word)
+#endif
 import System.Directory
 import System.IO (Handle, hClose, openTempFile, openBinaryTempFile,
        openBinaryTempFileWithDefaultPermissions, hPutStr)
 import System.IO.Error        (isAlreadyExistsError)
-import System.Posix.Internals (c_getpid)
 import System.FilePath        ((</>))
+import System.Random
 #ifdef mingw32_HOST_OS
 import System.Directory       ( createDirectory )
 #else
 import qualified System.Posix
 #endif
+import Text.Printf
 
 -- | Create, open, and use a temporary file in the system standard temporary directory.
 --
@@ -164,17 +174,25 @@
   :: FilePath -- ^ Parent directory to create the directory in
   -> String -- ^ Directory name template
   -> IO FilePath
-createTempDirectory dir template = do
-  pid <- c_getpid
-  findTempName pid
+createTempDirectory dir template = findTempName
   where
-    findTempName x = do
-      let dirpath = dir </> template ++ show x
+    findTempName = do
+      x :: Word <- randomIO
+      let dirpath = dir </> template ++ printf "-%.*x" (wordSize `div` 4) x
       r <- MC.try $ mkPrivateDir dirpath
       case r of
         Right _ -> return dirpath
-        Left  e | isAlreadyExistsError e -> findTempName (x+1)
+        Left  e | isAlreadyExistsError e -> findTempName
                 | otherwise              -> ioError e
+
+-- | Word size in bits
+wordSize :: Int
+wordSize =
+#if MIN_VERSION_base(4,7,0)
+ finiteBitSize (undefined :: Word)
+#else
+  bitSize (undefined :: Word)
+#endif
 
 mkPrivateDir :: String -> IO ()
 #ifdef mingw32_HOST_OS
diff --git a/temporary.cabal b/temporary.cabal
--- a/temporary.cabal
+++ b/temporary.cabal
@@ -1,5 +1,5 @@
 name:                temporary
-version:             1.2.1.1
+version:             1.3
 cabal-version:       >= 1.10
 synopsis:            Portable temporary file and directory support
 description:         Functions for creating temporary files and directories.
@@ -20,7 +20,7 @@
       Haskell2010
     exposed-modules: System.IO.Temp
     build-depends:   base >= 3 && < 10, filepath >= 1.1, directory >= 1.0,
-                     transformers >= 0.2.0.0, exceptions >= 0.6
+                     transformers >= 0.2.0.0, exceptions >= 0.6, random >= 1.1
                      -- note: the transformers dependency is needed for MonadIO
                      -- on older GHCs; on newer ones, it is included in base.
     ghc-options:     -Wall
