To aid static typing for in-place object freezing, I suggest that we make freeze a soft keyword instead.
The keyword should act as an operator rather than a function, so that it is not overridable and can thus be reliably used by static type checkers to keep track of the mutability state of an object, much like how type narrowing is done.
For example:
lst = list(range(10))
freeze lst
lst.append(1) # type checker error: arg 0 of list.append must be mutable
Typesheds for built-ins must also be comprehensively updated to reflect the mutability of each parameter. For backwards compatibility, parameters should be presumed to be mutable unless otherwise annotated as immutable.