If clients were designed to warn their users when a soft fork happens, then it could be done reasonably safely. The reference client does this (or is it just for high POW softforks?), but many SPV clients don't.
If there was a delay between version number changing and the rule activation, at least nodes would get a warning recommending that they update.
* At each difficulty interval, if 950 of the last 1000 blocks have the new version number, reject the old version blocks from then on.