diff --git a/lib/Filesystem.hs b/lib/Filesystem.hs
--- a/lib/Filesystem.hs
+++ b/lib/Filesystem.hs
@@ -73,12 +73,6 @@
 	, rename
 	) where
 
-#ifndef CABAL_OS_WINDOWS
-#if MIN_VERSION_base(4,2,0)
-#define SYSTEMFILEIO_LOCAL_OPEN_FILE
-#endif
-#endif
-
 import           Prelude hiding (FilePath, readFile, writeFile, appendFile)
 
 import qualified Control.Exception as Exc
@@ -118,6 +112,9 @@
 import           Data.Time.Clock.POSIX (posixSecondsToUTCTime)
 import qualified System.Posix as Posix
 import qualified System.Posix.Error as Posix
+#if MIN_VERSION_unix(2,5,1)
+import qualified System.Posix.Files.ByteString
+#endif
 
 #endif
 
@@ -158,7 +155,7 @@
 #else
 isDirectory path = Exc.catch
 	(do
-		stat <- posixStat "isFile" path
+		stat <- posixStat "isDirectory" path
 		return (Posix.isDirectory stat))
 	((\_ -> return False) :: IOError -> IO Bool)
 #endif
@@ -953,18 +950,23 @@
 	_ <- throwErrnoPathIfRetry failed loc path io
 	return ()
 
+posixStat :: String -> FilePath -> IO Posix.FileStatus
+#if MIN_VERSION_unix(2,5,1)
+posixStat _ path = System.Posix.Files.ByteString.getFileStatus (R.encode R.posix path)
+#else
+posixStat loc path = withFd loc path Posix.getFdStatus
+
 withFd :: String -> FilePath -> (Posix.Fd -> IO a) -> IO a
 withFd fnName path = Exc.bracket open close where
 	open = withFilePath path $ \cpath -> do
-		fd <- throwErrnoPathIfMinus1 fnName path (c_open cpath 0)
+		fd <- throwErrnoPathIfMinus1 fnName path (c_open_nonblocking cpath 0)
 		return (Posix.Fd fd)
 	close = Posix.closeFd
 
-posixStat :: String -> FilePath -> IO Posix.FileStatus
-posixStat loc path = withFd loc path Posix.getFdStatus
+foreign import ccall unsafe "hssystemfileio_open_nonblocking"
+	c_open_nonblocking :: CString -> CInt -> IO CInt
 
-foreign import ccall unsafe "open"
-	c_open :: CString -> CInt -> IO CInt
+#endif
 
 foreign import ccall unsafe "free"
 	c_free :: Ptr a -> IO ()
diff --git a/lib/hssystemfileio-unix.c b/lib/hssystemfileio-unix.c
--- a/lib/hssystemfileio-unix.c
+++ b/lib/hssystemfileio-unix.c
@@ -8,6 +8,7 @@
 
 #include <dirent.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <stddef.h>
 #include <stdlib.h>
 #include <sys/stat.h>
@@ -119,4 +120,11 @@
 	{ return rc; }
 	
 	return chmod(new_path, st.st_mode);
+}
+
+int
+hssystemfileio_open_nonblocking(const char *path, int int_mode)
+{
+	mode_t mode = int_mode | O_NONBLOCK;
+	return open(path, mode);
 }
diff --git a/lib/hssystemfileio-unix.h b/lib/hssystemfileio-unix.h
--- a/lib/hssystemfileio-unix.h
+++ b/lib/hssystemfileio-unix.h
@@ -24,4 +24,7 @@
 int
 hssystemfileio_copy_permissions(const char *old_path, const char *new_path);
 
+int
+hssystemfileio_open_nonblocking(const char *path, int mode);
+
 #endif
diff --git a/system-fileio.cabal b/system-fileio.cabal
--- a/system-fileio.cabal
+++ b/system-fileio.cabal
@@ -1,5 +1,5 @@
 name: system-fileio
-version: 0.3.10
+version: 0.3.11
 license: MIT
 license-file: license.txt
 author: John Millikin <jmillikin@gmail.com>
@@ -42,7 +42,7 @@
 source-repository this
   type: bazaar
   location: https://john-millikin.com/branches/system-fileio/0.3/
-  tag: system-fileio_0.3.9
+  tag: system-fileio_0.3.11
 
 library
   ghc-options: -Wall -O2
@@ -65,6 +65,8 @@
     build-depends:
         unix >= 2.3
     c-sources: lib/hssystemfileio-unix.c
+    if impl(ghc >= 7.2.0) && impl(ghc < 7.4.0)
+      cpp-options: -DSYSTEMFILEIO_LOCAL_OPEN_FILE
 
   exposed-modules:
     Filesystem
diff --git a/tests/FilesystemTests/Posix.hs b/tests/FilesystemTests/Posix.hs
--- a/tests/FilesystemTests/Posix.hs
+++ b/tests/FilesystemTests/Posix.hs
@@ -49,6 +49,14 @@
 			(fromText "\xA1\xA2.txt")
 		, test_IsFile "iso8859"
 			(decode "\xA1\xA2\xA3.txt")
+		, suite "pipe"
+			[ test_PipeIsFile "ascii"
+				(decode "test.txt")
+			, test_PipeIsFile "utf8"
+				(fromText "\xA1\xA2.txt")
+			, test_PipeIsFile "iso8859"
+				(decode "\xA1\xA2\xA3.txt")
+			]
 		]
 	, suite "isDirectory"
 		[ test_IsDirectory "ascii"
@@ -249,6 +257,18 @@
 	after <- liftIO $ Filesystem.isFile path
 	$expect after
 
+test_PipeIsFile :: Text -> FilePath -> Suite
+test_PipeIsFile test_name file_name = assertionsWithTemp test_name $ \tmp -> do
+	let path = tmp </> file_name
+	
+	before <- liftIO $ Filesystem.isFile path
+	$expect (not before)
+	
+	mkfifo_ffi path
+	
+	after <- liftIO $ Filesystem.isFile path
+	$expect after
+
 test_IsDirectory :: Text -> FilePath -> Suite
 test_IsDirectory test_name dir_name = assertionsWithTemp test_name $ \tmp -> do
 	let path = tmp </> dir_name
@@ -635,6 +655,14 @@
 	
 	$assert (ret == 0)
 
+-- | Create a FIFO using the raw POSIX API, via FFI
+mkfifo_ffi :: FilePath -> Assertions ()
+mkfifo_ffi path = do
+	ret <- liftIO $ withPathCString path $ \path_cstr ->
+		c_mkfifo path_cstr 0o700
+	
+	$assert (ret == 0)
+
 getcwd_ffi :: Assertions FilePath
 getcwd_ffi = do
 	buf <- liftIO $ c_getcwd nullPtr 0
@@ -690,6 +718,9 @@
 
 foreign import ccall unsafe "symlink"
 	c_symlink :: CString -> CString -> IO CInt
+
+foreign import ccall unsafe "mkfifo"
+	c_mkfifo :: CString -> CInt -> IO CInt
 
 foreign import ccall unsafe "getcwd"
 	c_getcwd :: CString -> CSize -> IO CString
diff --git a/tests/system-fileio-tests.cabal b/tests/system-fileio-tests.cabal
--- a/tests/system-fileio-tests.cabal
+++ b/tests/system-fileio-tests.cabal
@@ -40,3 +40,5 @@
     build-depends:
         unix >= 2.3 && < 2.6
     c-sources: ../lib/hssystemfileio-unix.c
+    if impl(ghc >= 7.2.0) && impl(ghc < 7.4.0)
+      cpp-options: -DSYSTEMFILEIO_LOCAL_OPEN_FILE
