diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,14 @@
 Brick changelog
 ---------------
 
+0.60.2
+------
+
+Bug fixes:
+ * Widgets reported as `clickable` are now reported as clickable even
+   when their renderings are cached with `cached` (#307; thanks Hari
+   Menon)
+
 0.60.1
 ------
 
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.60.1
+version:             0.60.2
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal user interfaces (TUIs) painlessly with 'brick'! You
diff --git a/src/Brick/Types/Internal.hs b/src/Brick/Types/Internal.hs
--- a/src/Brick/Types/Internal.hs
+++ b/src/Brick/Types/Internal.hs
@@ -249,7 +249,7 @@
     RS { viewportMap :: !(M.Map n Viewport)
        , rsScrollRequests :: ![(n, ScrollRequest)]
        , observedNames :: !(S.Set n)
-       , renderCache :: !(M.Map n (Result n))
+       , renderCache :: !(M.Map n ([n], Result n))
        , clickableNames :: ![n]
        } deriving (Read, Show, Generic, NFData)
 
diff --git a/src/Brick/Widgets/Core.hs b/src/Brick/Widgets/Core.hs
--- a/src/Brick/Widgets/Core.hs
+++ b/src/Brick/Widgets/Core.hs
@@ -958,29 +958,44 @@
                         withReaderT (& availHeightL .~ unrestricted) (render p)
         Greedy -> Nothing
 
--- | Render the specified widget. If the widget has an entry in the
--- rendering cache using the specified name as the cache key, use the
--- rendered version from the cache instead. If not, render the widget
--- and update the cache.
+-- | If the specified resource name has an entry in the rendering cache,
+-- use the rendered version from the cache. If not, render the specified
+-- widget and update the cache with the result.
 --
+-- To ensure that mouse events are emitted correctly for cached widgets, 
+-- in addition to the rendered widget, we also cache (the names of) 
+-- any clickable extents that were rendered and restore that when utilizing
+-- the cache.
+--
 -- See also 'invalidateCacheEntry'.
 cached :: (Ord n) => n -> Widget n -> Widget n
 cached n w =
     Widget (hSize w) (vSize w) $ do
         result <- cacheLookup n
         case result of
-            Just prevResult -> return prevResult
+            Just (clickables, prevResult) -> do
+                clickableNamesL %= (clickables ++)
+                return prevResult
             Nothing  -> do
                 wResult <- render w
-                cacheUpdate n wResult
+                clickables <- renderedClickables wResult
+                cacheUpdate n (clickables, wResult)
                 return wResult
+    where
+        -- Given the rendered result of a Widget, collect the list of "clickable" names
+        -- from the extents that were in the result.
+        renderedClickables :: (Ord n) => Result n -> RenderM n [n]
+        renderedClickables renderResult = do
+            allClickables <- use clickableNamesL
+            return [extentName e | e <- renderResult^.extentsL, extentName e `elem` allClickables]
 
-cacheLookup :: (Ord n) => n -> RenderM n (Maybe (Result n))
+
+cacheLookup :: (Ord n) => n -> RenderM n (Maybe ([n], Result n))
 cacheLookup n = do
     cache <- lift $ gets (^.renderCacheL)
     return $ M.lookup n cache
 
-cacheUpdate :: (Ord n) => n -> Result n -> RenderM n ()
+cacheUpdate :: (Ord n) => n -> ([n], Result n) -> RenderM n ()
 cacheUpdate n r = lift $ modify (& renderCacheL %~ M.insert n r)
 
 -- | Render the specified widget in a named viewport with the
