Question: Is the synchronised keyword still required (ignore backwards compatibility, I'm thinking in terms of writing new code, today) or should we all be using the features available in the Concurrent and Collection packages?

Answer: 
Indeed it is needed (in specific situations). Just read through [*Java Concurrency in Practice*](http://www.javaconcurrencyinpractice.com/), it is used there many times over.

Of course, since Java 5 we can usually happily solve problems using (almost) exclusively the `java.util.concurrent` toolbox. And even if we need to write our own thread-safe classes, `synchronized` can often be completely replaced by nonblocking algorithms such as [CAS](http://www.ibm.com/developerworks/java/library/j-jtp04186/index.html). However, CAS has its price as well, in that it requires very precise reasoning, tuning etc. and it is not well understood by lots of developers. Often it may provide no performance benefit, but it complicates the code. So there are cases when it is simpler and cleaner to just use a `synchronized` block.

Note also that locks are cheaper than they used to be as the JVM improves with every release. Long ago, this price was what turned off many developers from using them, but it is not so strongly justified anymore (and even if it is, only a concrete measurement can prove whether the performance bottleneck really is in locking).
Yes, the synchronized modifier is very much alive and required. Sure, you can use Locks and other stuff from the `java.util.concurrent` package but in many cases this is simply quite a big overhead. If you want to ensure that a certain piece of code gets executed exclusively the synchronized keyword is the quickest and safest solutation. There are a lot of situations, where obtaining a lock, getting it and releasing it simply isn't necessary.

So yes, for a good multithreaded program the use of the synchronized keyword is indeed required.