Not that there aren't extenuating circumstances, not that it's a "terrible crime", but, it is a vice in which people for the most part, at least initially, have some choice.
Again, I'm in favor of most everything you suggest, particularly decriminalization (which just makes sense). Still, in my view people need to take a little more personal responsibility. There are always excuses if we look for them.
The best way to encourage people to take a little more responsibility? Probably most of what you suggest as well as giving people healthy environments and opportunity and something to be optimistic about.
But traditionally shaming works a little as well. As unpleasant as this may sound. We appear to have come to a spot we think people shouldn't be shamed for anything. Well, except for being a racist or using PHP maybe. Shame was an effective social control for a long time and if we are going to do away with it we need to find a replacement.