For historical, simple, practical and portable reasons my scripts start normally with "#!/bin/sh", hence I restrict myself to those features available in the Bourne Shell.
The few cases where I would use ksh or bash is if I know this script is targetted at some subset of platforms where that is available and required for the job. If it's not required, then back to good old sh.
I also use "test" rather than [ or [[ as I like to see blatently what a script is really doing. Ie, my model is that
"if" uses it's arguments as a command line and will use the
then or else clause depending on zero or non zero
return code of that command.
hence I am more than happy to use "if" with many other programs, not just test or some link to it.