diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,16 @@
 Brick changelog
 ---------------
 
+0.49
+----
+
+New features:
+ * The `FileBrowser` now supports navigation of directories via
+   symlinks, so `Enter` on a symlink will descend into the target path
+   of the symlink if that path is a directory. Part of this change is
+   that the `FileInfo` type got a new file, `fileInfoLinkTargetType`,
+   that indicates the type of file that the link points to, if any.
+
 0.48
 ----
 
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.48
+version:             0.49
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
diff --git a/src/Brick/Widgets/FileBrowser.hs b/src/Brick/Widgets/FileBrowser.hs
--- a/src/Brick/Widgets/FileBrowser.hs
+++ b/src/Brick/Widgets/FileBrowser.hs
@@ -102,6 +102,7 @@
   , fileInfoSanitizedFilenameL
   , fileInfoFilePathL
   , fileInfoFileStatusL
+  , fileInfoLinkTargetTypeL
   , fileStatusSizeL
   , fileStatusFileTypeL
 
@@ -197,6 +198,9 @@
              -- ^ The file status if it could be obtained, or the
              -- exception that was caught when attempting to read the
              -- file's status.
+             , fileInfoLinkTargetType :: Maybe FileType
+             -- ^ If this entry is a symlink, this indicates the type of
+             -- file the symlink points to, if it could be obtained.
              }
              deriving (Show, Eq)
 
@@ -268,6 +272,10 @@
 selectNonDirectories i =
     case fileInfoFileType i of
         Just Directory -> False
+        Just SymbolicLink ->
+            case fileInfoLinkTargetType i of
+                Just Directory -> False
+                _ -> True
         _ -> True
 
 -- | A file entry selector that permits selection of directories
@@ -277,6 +285,10 @@
 selectDirectories i =
     case fileInfoFileType i of
         Just Directory -> True
+        Just SymbolicLink ->
+            case fileInfoLinkTargetType i of
+                Just Directory -> True
+                _ -> False
         _ -> False
 
 -- | Set the filtering function used to determine which entries in
@@ -346,10 +358,23 @@
                               , fileStatusSize = sz
                               }
 
+    targetTy <- case fileStatusFileType <$> stat of
+        Right (Just SymbolicLink) -> do
+            targetPathResult <- E.try $ U.readSymbolicLink filePath
+            case targetPathResult of
+                Left (_::E.SomeException) -> return Nothing
+                Right targetPath -> do
+                    targetInfo <- liftIO $ getFileInfo "unused" targetPath
+                    case fileInfoFileStatus targetInfo of
+                        Right (FileStatus _ targetTy) -> return targetTy
+                        _ -> return Nothing
+        _ -> return Nothing
+
     return FileInfo { fileInfoFilename = name
                     , fileInfoFilePath = filePath
                     , fileInfoSanitizedFilename = sanitizeFilename name
                     , fileInfoFileStatus = stat
+                    , fileInfoLinkTargetType = targetTy
                     }
 
 -- | Get the file type for this file info entry. If the file type could
@@ -574,8 +599,16 @@
             if fileBrowserSelectable b entry
             then return $ b & fileBrowserSelectedFilesL %~ Set.insert (fileInfoFilename entry)
             else case fileInfoFileType entry of
-                Just Directory -> liftIO $ setWorkingDirectory (fileInfoFilePath entry) b
-                _ -> return b
+                Just Directory ->
+                    liftIO $ setWorkingDirectory (fileInfoFilePath entry) b
+                Just SymbolicLink ->
+                    case fileInfoLinkTargetType entry of
+                        Just Directory -> do
+                            liftIO $ setWorkingDirectory (fileInfoFilePath entry) b
+                        _ ->
+                            return b
+                _ ->
+                    return b
 
 selectCurrentEntry :: FileBrowser n -> EventM n (FileBrowser n)
 selectCurrentEntry b =
