Simply, insert DATE (i.e. use TO_DATE function) when you have a "human understandable" date format in order to avoid errors.
For example, date format we use in Croatia is dd.mm.yyyy - if default NLS settings are different from that, I'll get an error when trying to insert such a format into a DATE column. Therefore, and - even better - ALWAYS use TO_DATE function - don't rely on Oracle's implicit conversion between datatypes.
On the other hand, you'd use TO_CHAR function to present date (which is stored into the table in Oracle's internal format, and which is always the same) to the end user in format he wants you to: dd.mm.yyyy, dd-mon-yy, mm/dd/yy, etc.
SQL> create table test (col_datum date);
SQL> insert into test values (to_date('14.03.2003', 'dd.mm.yyyy'));
1 row created.
SQL> select to_char(sysdate, 'yy/dd/mon') from dual;