Hi Dave,
Yes, that certainly was a bug. I've applied your fixes with a small difference.
Your code locates all instances where the given object matches the current object in the list, and shifts all remaining objects on the right one slot to the left to affect the remove. However, the implementation of the remove(int indexBase1) sets the value at the index to null and then trims nulls from the end of the list.
The remove implementation that i've applied will only remove the first occurrence of a matching object (from left to right), and will remove it by setting it to null (via a call to the remove(int) method, so trimming of nulls on the right will also occur). This is only for consistency sake.
I've also implemented your original code, but renamed it removeAll(E). The code changes have been checked into the CVS repo. Let me know if this doesn't work for your purposes and we'll figure something out.