Sounds like pip (popular package manager for Python) avoids this problem because you don't use pip to install or upgrade itself. If using the package manager to install updated versions of itself is an intended use case, then I agree with others: it should check your path after the install and make sure the newly installed binary is the one that will get used. Otherwise the design is making it too easy to do the wrong thing.
The problem he reports is that when he upgrades the Cabal binary by running 'cabal install cabal-install', the sequence of events is:
1. The system runs /usr/bin/cabal
2. Cabal fetches and builds the new binary
3. The new binary is installed to $HOME/.cabal/bin/
4. When he runs 'cabal update' again, it still uses /usr/bin/cabal because $HOME/.cabal/bin/ is not on his $PATH