It depends on the context. In a math context (which is preferable if you're writing your scripts specifically for bash), use ==.
(( foo == 3 ))     ## foo = 3 would be an assignment here, and foo -eq 3 an error
A math context is also present in other situations -- for instance, indexing into a non-associative array, making == preferred but -eq illegal in the below contrieved example:
foo=( yes no )
bar=3
echo "${foo[bar == 3 ? 0 : 1]}" # echoes "yes"
In [[ ]], use -eq.
[[ $foo -eq 3 ]]   ## $foo = 3 would be a string comparison here; $foo == 3 is a synonym,
                   ## but bad finger-memory to have if one wants to write POSIX code
                   ## elsewhere.
In [ ], use -eq -- and also quote:
[ "$foo" -eq 3 ]   ## = would be a valid string comparison here; == would be a
                   ## POSIX-incompatible string comparison here; -eq is correct.