diff -ur lucene-2.4.0/src/java/org/apache/lucene/search/CachingWrapperFilter.java lucene-2.4.0-patch/src/java/org/apache/lucene/search/CachingWrapperFilter.java
--- lucene-2.4.0/src/java/org/apache/lucene/search/CachingWrapperFilter.java	2008-10-01 04:58:30.000000000 -0700
+++ lucene-2.4.0-patch/src/java/org/apache/lucene/search/CachingWrapperFilter.java	2008-11-17 13:52:07.827185468 -0800
@@ -18,6 +18,7 @@
  */
 
 import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.util.DocIdBitSet;
 import java.util.BitSet;
 import java.util.WeakHashMap;
 import java.util.Map;
@@ -51,12 +52,19 @@
       cache = new WeakHashMap();
     }
 
+	Object cached = null;
     synchronized (cache) {  // check cache
-      BitSet cached = (BitSet) cache.get(reader);
-      if (cached != null) {
-        return cached;
-      }
-    }
+      cached = cache.get(reader);
+	}
+	
+    if (cached == null) {
+		  // fallthrough
+	} else if (cached instanceof BitSet) {
+      return (BitSet)cached;
+    } else if (cached instanceof DocIdBitSet) {
+      return ((DocIdBitSet)cached).getBitSet();
+	}
+	// It would be nice to handle the DocIdSet case, but that's not really possible
 
     final BitSet bits = filter.bits(reader);
 
@@ -72,11 +80,15 @@
       cache = new WeakHashMap();
     }
 
+	Object cached = null;
     synchronized (cache) {  // check cache
-      DocIdSet cached = (DocIdSet) cache.get(reader);
-      if (cached != null) {
-        return cached;
-      }
+      cached = cache.get(reader);
+	}
+    if (cached != null) {
+      if (cached instanceof DocIdSet)
+        return (DocIdSet)cached;
+      else
+        return new DocIdBitSet((BitSet)cached);
     }
 
     final DocIdSet docIdSet = filter.getDocIdSet(reader);

