PIC16 y PIC18 son arquitecturas muy diferentes, las memorias RAM estan organizadas de forma diferente especialmente.
Por lo tanto lo correcto es comparar PIC16 con PIC16...
Hay PICs con ADC y otros no lo tienen (generalmente los mas viejitos) , los PIC16 fueron evolucionando poco a poco, como vos decis hay micros que los registros de analogico/digital se acomodaban con el ADCONx, lueg pasaron a los ANSEL. Y finalmente los puertos el tener solo PORTx puede llegar a causar problema ya que el micro lee el puerto cambia el estado y graba el puerto nuevamente (ante un cambio del puerto) esto hace que si cambias muy rapidamente el puerto, y un pin tiene una carga grande capacitiva, al leer por segunda ves el pin que deberia estar en 1, no llego y leyo un 0, entonces cuando escribe el puerto lo hace mal..
Es ahi donde los PIC18 implementaba los LATx y PORTx, donde LAT es el registro de salida.. es decir el que maneja el driver... mientras que PORTx lees el pin directo... De esa forma por mas que tarde en cambiar una salida, al leer el micro lee el LATx el cual no es afectado por eso. Por eso mismo se dice que usas LATx para escribir y PORTx para leer.
. Eso sin contar que cada compilador tiene instrucciones y funciones específicas que otros no.
Personalmente me gusta XC8 por que no uso ninguna funcion especifica (a puro registros), si debo hacerlo la hago yo a la funcion. Lo mismo podes hacer con mikroC, pero tambien tenes funciones que te facilitan la vida... CCS es mas complicado de hacer, ya que ellos ya te proveen unas series de funciones que necesitas usar y te olvidas de tocar registros... O lidias con registros, o lidias con aprenderte las funciones...
Eso si... implementar un codigo UART por ejemplo en XC8 sin nada es mucho mas complicado que poner una sola linea en CCS y ya tenes configurado tu UART de forma mucho mas simple