diff --git a/FileManipCompat.cabal b/FileManipCompat.cabal
--- a/FileManipCompat.cabal
+++ b/FileManipCompat.cabal
@@ -1,5 +1,5 @@
 Name:               FileManipCompat
-Version:            0.12
+Version:            0.13
 License:            BSD3
 License-File:       LICENSE
 Author:             Bryan O'Sullivan <bos@serpentine.com>
diff --git a/System/FilePath/FindCompat.hs b/System/FilePath/FindCompat.hs
--- a/System/FilePath/FindCompat.hs
+++ b/System/FilePath/FindCompat.hs
@@ -4,7 +4,7 @@
 -- which was derived from FileManip package, which only works on unix.
 -- happstack port works on windows as well.
 -- repackage here as standalone to remove dependency on happstack, for immediate use with HStringTemplateHelpers.
-module System.FilePath.FindCompat (always,find) where
+module System.FilePath.FindCompat where
 
 import qualified System.PosixCompat.Files as F
 import Control.Monad.State
@@ -14,7 +14,7 @@
 import System.Directory (getDirectoryContents)
 import System.IO.Unsafe (unsafeInterleaveIO)
 import System.FilePath ((</>))
-
+import Data.Bits (Bits, (.&.))
 
 -- | Information collected during the traversal of a directory.
 data FileInfo = FileInfo
@@ -26,6 +26,39 @@
 instance Eq F.FileStatus where
     a == b = F.deviceID a == F.deviceID b && F.fileID a == F.fileID b 
 
+data FileType = BlockDevice
+              | CharacterDevice
+              | NamedPipe
+              | RegularFile
+              | Directory
+              | SymbolicLink
+              | Socket
+              | Unknown
+                deriving (Eq, Ord, Show)
+
+-- | Return the type of file currently being visited.
+--
+-- Example:
+--
+-- @
+-- 'fileType' '==?' 'RegularFile'
+-- @
+fileType :: FindClause FileType
+fileType = statusType `liftM` fileStatus
+
+-- | Return the type of a file.  This is much more useful for case
+-- analysis than the usual functions on 'F.FileStatus' values.
+statusType :: F.FileStatus -> FileType
+
+statusType st | F.isBlockDevice st = BlockDevice
+statusType st | F.isCharacterDevice st = CharacterDevice
+statusType st | F.isNamedPipe st = NamedPipe
+statusType st | F.isRegularFile st = RegularFile
+statusType st | F.isDirectory st = Directory
+statusType st | F.isSymbolicLink st = SymbolicLink
+statusType st | F.isSocket st = Socket
+statusType _ = Unknown
+
 -- | Construct a 'FileInfo' value.
 
 mkFI :: FilePath -> Int -> F.FileStatus -> FileInfo
@@ -61,6 +94,18 @@
        -> a
 evalFI m p d s = evalClause m (mkFI p d s)
 
+mkFindClause :: (FileInfo -> (a, FileInfo)) -> FindClause a
+mkFindClause = FC . State
+
+-- | Return the current 'FileInfo'.
+fileInfo :: FindClause FileInfo
+fileInfo = mkFindClause $ \st -> (st, st)
+
+
+-- | Return the 'F.FileStatus' for the current file.
+fileStatus :: FindClause F.FileStatus
+fileStatus = infoStatus `liftM` fileInfo
+
 type FilterPredicate = FindClause Bool
 type RecursionPredicate = FindClause Bool
 
@@ -119,3 +164,64 @@
 always :: FindClause Bool
 always = return True
 
+-- | Return the name of the file being visited.
+filePath :: FindClause FilePath
+
+filePath = infoPath `liftM` fileInfo
+
+
+-- | Lift a binary operator into the 'FindClause' monad, so that it
+-- becomes a combinator.  The left hand side of the combinator should
+-- be a @'FindClause' a@, while the right remains a normal value of
+-- type @a@.
+liftOp :: Monad m => (a -> b -> c) -> m a -> b -> m c
+
+liftOp f a b = a >>= \a' -> return (f a' b)
+
+-- $binaryOperators
+-- 
+-- These are lifted versions of the most commonly used binary
+-- operators.  They have the same fixities and associativities as
+-- their unlifted counterparts.  They are lifted using 'liftOp', like
+-- so:
+-- 
+-- @('==?') = 'liftOp' (==)@
+
+
+(==?) :: Eq a => FindClause a -> a -> FindClause Bool
+(==?) = liftOp (==)
+infix 4 ==?
+
+(/=?) :: Eq a => FindClause a -> a -> FindClause Bool
+(/=?) = liftOp (/=)
+infix 4 /=?
+
+(>?) :: Ord a => FindClause a -> a -> FindClause Bool
+(>?) = liftOp (>)
+infix 4 >?
+
+(<?) :: Ord a => FindClause a -> a -> FindClause Bool
+(<?) = liftOp (<)
+infix 4 <?
+
+(>=?) :: Ord a => FindClause a -> a -> FindClause Bool
+(>=?) = liftOp (>=)
+infix 4 >=?
+
+(<=?) :: Ord a => FindClause a -> a -> FindClause Bool
+(<=?) = liftOp (<=)
+infix 4 <=?
+
+-- | This operator is useful to check if bits are set in a
+-- 'T.FileMode'.
+(.&.?) :: Bits a => FindClause a -> a -> FindClause a
+(.&.?) = liftOp (.&.)
+infixl 7 .&.?
+
+(&&?) :: FindClause Bool -> FindClause Bool -> FindClause Bool
+(&&?) = liftM2 (&&)
+infixr 3 &&?
+
+(||?) :: FindClause Bool -> FindClause Bool -> FindClause Bool
+(||?) = liftM2 (||)
+infixr 2 ||?
