Thank you for your question. Please see my answer below.
--> With each new version of Java comes new features and depreciation of old features and APIs. I am curious, what old features are best to leave behind and which new features should be used in its place?
I would certainly say the old IO API is one to leave behind in favor of NIO.2, even though, admittedly, this is not going to be easy as there are still billions of apps that contain the old API. If you're starting a new project, however, you should consider the new API as it's more stable than its predecessor.
Another one: the Java’s built-in support for writing multi-threaded applications, such as the Thread class and the synchronized keyword, should not be used anymore. They are hard to use correctly because they are too low level. Java 5 added the Concurrency Utilities in the java.util.concurrent package and subpackages. The types in these packages have been designed to provide better alternatives to Java’s built-in thread and synchronization features. (In my book, threads and the Concurrency Utilites are discussed in Chapter 23 and Chapter 24, respectively.)