Várias dessas já são vantagens por evitar más práticas.

A existência de parâmetros com nomes duplicados é algo que obviamente não deveria ocorrer, tanto que não é permitido no modo estrito.

O uso de "this" é algo que você deve evitar, pois torna o código mais imprevisível e menos legível. No exemplo mencionado no post, é melhor simplesmente fazer:

let person = {
  name: "Ernane Ferreira",
  sayMyName: () => console.log(My name is ${person.name}.)
};

person.sayMyName(); // => My name is Ernane Ferreira.

Outra diferença que não foi mencionada no post e deve ser evitada é o hoisting. Funções clássicas podem ser utilizadas antes de serem declaradas, o que pode parecer bom inicialmente, mas torna o código menos legível e mais imprevisível, uma vez que o JavaScript é uma linguagem scriptada que é executada de cima para baixo.

Outra diferença não mencionada que deve ser evitada é a sobrecarga de funções (function overloading). Funções clássicas podem ser sobrescritas simplesmente declarando uma nova função com o mesmo nome. Não é preciso dizer que isso também torna o código mais imprevisível e menos legível.

Quanto ao restante das diferenças, acredito que sejam insignificantes. Por fim, também acredito que usar apenas arrow functions torna o código mais coeso, uma vez que as arrow functions são algo que você inevitavelmente usará em callbacks eventualmente.

Sendo bem sincero as vantagens que você listou, na minha opinião não compensão a pior legibilidade do código, talvez por eu ser acostumado com linguagens compiladas, mas para mim arrow functions são extremamente situacionais e deveriam ser usadas em contextos muito especificos e não como se fossem funções comuns, alem de impedirem o reaproveitamento de código etc.