However, it is *utterly* trivial to implement a subclass of String (call it "ImmutableString") that delegates the subclass responsibilities of String to an iVar and simply raises errors when trying to access them via #at:put: and friends. Then you simply implement String>>asImmutableString properly (^ImmutableString on: self) and off ya go!
Certainly that will work for String's in 3.7. In 3.8 there is also ByteString and WideString. Futhermore you would probably also need immutabilty for other instances like LargeInteger's, Float's, Array's and maybe some other classes.
Cheers, Lukas