diff --git a/System/IO.hs b/System/IO.hs
index 0d9d0298736c25a7ec44da8f2432eed67ca79a64..2970cf0b5e90f19a61b546dcc1cc5d3c50e82a89 100644
--- a/System/IO.hs
+++ b/System/IO.hs
@@ -425,7 +425,12 @@ openTempFile' loc tmp_dir template binary = do
   pid <- c_getpid
   findTempName pid
   where
-    (prefix,suffix) = break (=='.') template
+    -- We split off the last extension, so we can use .foo.ext files
+    -- for temporary files (hidden on Unix OSes). Unfortunately we're
+    -- below filepath in the hierarchy here.
+    (prefix,suffix) = case break (== '.') $ reverse template of
+                          (rev_suffix, rev_prefix) ->
+                              (reverse rev_prefix, reverse rev_suffix)
 
     oflags1 = rw_flags .|. o_EXCL