Problems found using the rule checker: 1. The Number classes all overrode #~=. They didn't need to do that in order to produce correct results; it was an efficiency hack. But without them, the compiler could inline Object's definition x ~= y => (x = y) not which should eventually be even better. 2. SequencedReadableCollection defined #= ReadOnlyString inherited it String inherited it too Symbol overrode it The effect was that x := "foo". y := String withAll: x. x = y returned false, whereas in Smalltalks without ReadOnlyString it would be expected to return true. Now {ReadOnlyString|String} = {ReadOnlyString|String} is allowed and works on the contents, but it remains true that Symbols are only ever equal to other Symbols. 3. In Collections, c notEmpty is the same as c isEmpty not, so you get used to the idea that you can use whichever of isEmpty or notEmpty is clearer in context. However several kinds of Stream defined #isEmpty without defining #notEmpty. 4. The other indexed collections supported atAll:put: as well as at:put:. Dictionary didn't, and there's no reason why it couldn't. 5. I wanted to provide a new (indexableCollection at: key exchange: newValue) method which would return the old value. The main purpose was to remove elements from an array, e.g., x := array at: i exchange: nil and to halve the cost of index checking for this. The rule checker told me about all the classes that needed the new method. 6. Knowing that Duration>>isZero and Duration class>>zero existed, and that #isZero existed for numeric classes, I expected that #zero would exist as well, e.g., FloatD zero. But it doesn't! I've added zero and one methods to the number classes in complex.st 7. In addition to #withAll:, I have provided #withAll:collect: methods in the relevant collection classes. However, some of them turned out to be missing. 8. I have some numeric vector classes meant long term to be a BLAS-1 wrapper. These things are supposed to have all the appropriate numeric methods, but they do not and cannot inherit from Number. They were missing #negated. 9. Point and Rectangle had #rounded and #truncated but not #floor or #ceiling. Point acts a lot like a 2-vector; it was also missing #raisedTo: and #raisedToInteger:. 10. A new method from:to:valuesDo: had been added to the classes where it was needed for something else, but not to all the classes where it made sense. 11. A new collection class could remove one thing at a time but not everything at once. 12. Two new stream classes had the general #position: method for repositioning but not the useful shorthand #reset for moving to the beginning. 13. FileStream had peek but not peekFor:, and so did DecodedInputStream. 14. NDBM class defined useless #withAll:[collect:] methods. They are NOT needed to prevent unsuitable methods being inherited; removing them means that NBDM class does not have any such methods at all.