I was reorganising an old crate this week and noticed how much of my early Rust pain has simply vanished, and most of it traces back to the 2018 edition. It's a few years old now, but I never wrote down quite how much it changed the day-to-day feel of the language for me.
The big one was non-lexical lifetimes. Before NLL, a borrow lived until the end of its lexical scope whether you used it again or not, which meant the borrow checker would reject perfectly sensible code and you'd end up inserting extra braces or temporary bindings to teach it where the borrow really ended. After NLL, the checker understands that a reference you stop using is a reference you've stopped using. A huge swathe of "but this is obviously fine" arguments with the compiler just stopped happening.
The smaller quality-of-life wins added up too. No more extern crate lines cluttering the top of every file. Paths in use that finally made sense, with crate:: meaning what you'd hope. Modules without the mod.rs ceremony. None of these are profound on their own, but together they removed a layer of boilerplate I'd stopped even noticing I was carrying.
What I take from it is that the most valuable language changes are often the ones that delete friction rather than add features. I didn't gain new powers in 2018. I just stopped fighting the borrow checker over things that were never really borrowing problems, and started spending that attention on the actual problem instead. That's the kind of upgrade I'll take every time.