Gõ mạnh / yếu và gõ tĩnh / động là trực giao.
Mạnh / yếu là về loại giá trị có quan trọng hay không, nói theo chức năng. Trong một ngôn ngữ được gõ yếu, bạn có thể lấy hai chuỗi xảy ra để điền vào các chữ số và thực hiện phép cộng số nguyên trên chúng; trong một ngôn ngữ được gõ mạnh, đây là một lỗi (trừ khi bạn bỏ hoặc chuyển đổi các giá trị thành các loại chính xác trước). Gõ mạnh / yếu không phải là một điều đen trắng; hầu hết các ngôn ngữ không nghiêm ngặt 100% cũng không yếu 100%.
Gõ tĩnh / động là về việc các loại liên kết với các giá trị hoặc với các định danh. Trong một ngôn ngữ được gõ động, bạn có thể gán bất kỳ giá trị nào cho bất kỳ biến nào, bất kể loại nào; gõ tĩnh định nghĩa một loại cho mỗi mã định danh và việc gán từ một loại khác là lỗi hoặc dẫn đến kết quả là ẩn. Một số ngôn ngữ có cách tiếp cận hỗn hợp, cho phép các loại khai báo tĩnh cũng như các định danh chưa được đánh dấu ('biến thể'). Ngoài ra còn có kiểu suy luận, một cơ chế có thể gõ tĩnh mà không cần khai báo rõ ràng loại của mọi thứ, bằng cách trình biên dịch tìm ra các loại (Haskell sử dụng rộng rãi, C # hiển thị nó thông qua var
từ khóa).
Lập trình năng động yếu cho phép một cách tiếp cận thực tế; ngôn ngữ không cản trở bạn trong hầu hết thời gian, nhưng nó sẽ không bước vào khi bạn tự bắn vào chân mình. Ngược lại, gõ tĩnh mạnh, thúc đẩy lập trình viên thể hiện những kỳ vọng nhất định về các giá trị rõ ràng trong mã, theo cách cho phép trình biên dịch hoặc trình thông dịch phát hiện một lớp lỗi. Với một hệ thống loại tốt, một lập trình viên có thể xác định chính xác những gì có thể và không thể thực hiện đối với một giá trị, và nếu, một cách tình cờ, ai đó cố gắng đôi khi không mong muốn, hệ thống loại thường có thể ngăn chặn nó và hiển thị chính xác nơi và tại sao mọi thứ lại sai.