There are a lot of possibilities for braces (such as omitting them), and things get even more complicated when dealing with objects or arrays.
I prefer interpolation to concatenation, and I prefer to omit braces when not necessary. Sometimes, they are.
You cannot use object operators with ${} syntax. You must use {$...} when calling methods, or chaining operators (if you have only one operator such as to get a member, the braces may be omitted).
The ${} syntax can be used for variable variables:
$y = 'x';
$x = 'hello';
echo "${$y}"; //hello
The $$ syntax does not interpolate in a string, making ${} necessary for interpolation. You can also use strings (${'y'}) and even concatenate within a ${} block. However, variable variables can probably be considered a bad thing.
For arrays, either will work ${foo['bar']} vs. {$foo['bar']}. I prefer just $foo[bar] (for interpolation only -- outside of a string bar will be treated as a constant in that context).