Good parting point.
Why is it bad that you can redefine random parts of the system in smalltalk? This seems like a lot of power tastefully expressed.
At the very least, it makes composability difficult. (like Ruby programmers who overzealously monkeypatch.) Without a way to scope such changes, you shift the ground beneath all code, including libraries you might want to use.
I’m a fan of the Lua approach, where you can redefine random parts of a system, but only in a scoped way (for instance, you could load an untrusted library with a stubbed-out filesystem that reads from memory).